Изменить форму данных Pandas на основе значений в двух столбцах - PullRequest
3 голосов
/ 01 апреля 2019

В Python я хотел бы искать по всем строкам в фрейме данных с двумя возможными путями (фрейм данных заполняется из CSV-файлов). Если столбец «Группа» для данной строки равен нулю, переместите данные этой строки в следующую строку нового фрейма данных, используя столбцы «Канал_1» и «Данные_1». Если столбец «Группа» для данной строки не равен нулю, то получите все три строки с одинаковым значением столбца «Группа» (также идентифицируемым в столбце «подгруппа» как 1, 2 или 3) и добавьте к следующему строка нового кадра данных.

Код для генерации кадра данных из CSV-файла:

for name in glob.glob(search_string):
    r_file = pd.read_csv(name)

Текущий формат данных:

Channel_Num    Group    Sub_Group    Data
1000            1        1            100
1001            1        2            105
1002            1        3            110
1003            0        0            200
1004            2        1            400
1005            2        2            405
1006            2        3            410
1007            0        0            500

Желаемый формат данных:

Group    Channel_1    Data_1    Channel_2   Data_2   Channel_3   Data_3
1         1000         100       1001        105      1002        110
0         1003         200       NaN         NaN      NaN         NaN   
2         1004         400       1005        405      1006        410
0         1007         500       NaN         NaN      NaN         NaN

Я пробовал методы GroupBy и pivot_table, но безуспешно. После того, как данные представлены в нужном формате, существуют другие вычисления, которые необходимо выполнить для вновь организованных данных, но ключом является получение их в нужном формате.

1 Ответ

2 голосов
/ 01 апреля 2019

Это больше похоже на проблему поворота после создания дополнительного ключа с помощью diff и cumsum, поэтому я использую pivot_table и несколько столбцов сглаживают

df.loc[df.Sub_Group==0,'Sub_Group']=1
df['newkey']=df.Group.diff().ne(0).cumsum()
s=df.pivot_table(index=['Group','newkey'],columns=['Sub_Group'],values=['Channel_Num','Data'],aggfunc='first').sort_index(level=1,axis=1)
s.columns=s.columns.map('{0[0]}_{0[1]}'.format) 
s.reset_index(level=0).sort_index()
Out[25]: 
        Group  Channel_Num_1  Data_1   ...    Data_2  Channel_Num_3  Data_3
newkey                                 ...                                 
1           1         1000.0   100.0   ...     105.0         1002.0   110.0
2           0         1003.0   200.0   ...       NaN            NaN     NaN
3           2         1004.0   400.0   ...     405.0         1006.0   410.0
4           0         1007.0   500.0   ...       NaN            NaN     NaN
[4 rows x 7 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...