2016-09-18 3 views
0

Я пытаюсь построить-х 24 таблицы в панде со следующими данными ниже:Извлечения данных из нескольких строкового кронштейна в пандах и создать новую таблицу

d.iloc[0:2] = [[0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L], [0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 2L, 2L, 0L, 0L, 0L]] 

В принципе, первая суб-кронштейн представляет 24 часов данные за один день в январе, а вторая - в феврале. Ищу структурировать таблицу 2x24 (без «L») следующим образом:

1 2 3 4 5 6 7 8 9 10 11 12 ... 24 
Jan 0 0 0 0 0 0 0 0 0 1 1 1 ... 0 
Feb 0 0 0 0 0 0 0 0 0 1 1 1 ... 0 

Что я нахожу сложным является зачистки (.strip), разделение и копирование данных в новую структуру dataframe. Я часто нахожу исходную структуру на онлайн-кадрах данных с 12 суб-скобами (по одному для каждого месяца). Я включил d.iloc[0,2], потому что я собираюсь применить функцию ко всем элементам в столбце 2 с помощью цикла for. Спасибо за вашу драгоценную помощь.

ответ

1

Я думаю, что вы можете использовать DataFrame.from_records с применить str.strip:

import pandas as pd 
import numpy as np 

a = [['0L', '0L', '0L', '0L', '0L', '0L', '0L', '0L', '0L', '1L', '1L', '1L', '1L', '1L', '0L', '0L', '0L', '1L', '1L', '1L', '1L', '0L', '0L', '0L'], 
    ['0L', '0L', '0L', '0L', '0L', '0L', '0L', '0L', '0L', '1L', '1L', '1L', '1L', '1L', '0L', '0L', '0L', '1L', '1L', '2L', '2L', '0L', '0L', '0L']] 

idx = ['Jan','Feb'] 
df = pd.DataFrame.from_records(a, index=idx).apply(lambda x: x.str.strip('L').astype(int)) 
print (df) 
    0 1 2 3 4 5 6 7 8 9 ... 14 15 16 17 18 19 20 \ 
Jan 0 0 0 0 0 0 0 0 0 1 ... 0 0 0 1 1 1 1 
Feb 0 0 0 0 0 0 0 0 0 1 ... 0 0 0 1 1 2 2 

    21 22 23 
Jan 0 0 0 
Feb 0 0 0 

[2 rows x 24 columns] 

Более общее решение с генерирующими месяцев имен по dt.strftime:

print (pd.Series(range(1,len(a) + 1))) 
0 1 
1 2 
dtype: int32 

idx = pd.to_datetime(pd.Series(range(1,len(a) + 1)), format='%m').dt.strftime('%b') 
0 Jan 
1 Feb 
dtype: object 

df = pd.DataFrame.from_records(a, index=idx).apply(lambda x: x.str.strip('L').astype(int)) 
print (df) 
    0 1 2 3 4 5 6 7 8 9 ... 14 15 16 17 18 19 20 \ 
Jan 0 0 0 0 0 0 0 0 0 1 ... 0 0 0 1 1 1 1 
Feb 0 0 0 0 0 0 0 0 0 1 ... 0 0 0 1 1 2 2 

    21 22 23 
Jan 0 0 0 
Feb 0 0 0 

Если потребность split значения первых:

b = [['0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 0L'], 
    ['0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 2L, 2L, 0L, 0L, 0L']] 

idx = pd.to_datetime(pd.Series(range(1,len(a) + 1)), format='%m').dt.strftime('%b') 

df1 = pd.DataFrame.from_records(b, index=idx) 
     .iloc[:,0] 
     .str.split(', ', expand=True) 
     .replace({'L':''}, regex=True) 
     .astype(int) 
print (df1) 

    0 1 2 3 4 5 6 7 8 9 ... 14 15 16 17 18 19 20 \ 
Jan 0 0 0 0 0 0 0 0 0 1 ... 0 0 0 1 1 1 1 
Feb 0 0 0 0 0 0 0 0 0 1 ... 0 0 0 1 1 2 2 

    21 22 23 
Jan 0 0 0 
Feb 0 0 0 

[2 rows x 24 columns] 
+0

Как это работает? – jezrael

+0

Благодарим вас за подробный ответ. Я не могу применить .str.strip ('L'). Astype (int) к ячейке фрейма данных: AttributeError: объект 'str' не имеет атрибута 'str'. Как так? (ячейка является str-типом) – John12

+0

Это не работает с образцом или с реальными данными? – jezrael