Панды снимают старую форму данных. - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть этот пример кадра данных

ID1,ID2,info,Value
1,50,BA,101
1,50,BA,102
2,100,CA,03
2,100,CA,07
2,100,BA,09
2,100,BA,10

Чтобы изменить данные, я использую unstack, и это больше похоже на 90%, который я хочу, и это работает.

grouped = df.groupby(['ID1','ID1','ID2','info'])[['Value']].apply(lambda x: pd.DataFrame(x.values, columns=[['Value']]))\
                        .unstack().sort_index(level=1, axis=1).reset_index(drop= True, level=1).reset_index()

grouped.columns = ['{}{}'.format(a,b) for a, b in df_grouped.columns]

иэто результат, который у меня есть

ID1,ID2,info,Value0,Value1
1,50,BA,101,102
2,100,BA,9,10
2,100,CA,3,7

, возможно, было бы более понятным, если бы я мог поместить все ID1 в одну строку, и если бы у меня было два различных информационных значения, соответствующих ID1, то я хотел бы добитьсячто-то похожее на это

ID1,ID2,info,Value0,Value1,Value2,Value3
1,50,BA,101,102,,
2,100,[BA,CA],9,10,3,7

Есть предложения?

1 Ответ

0 голосов
/ 15 ноября 2018

Ваше решение должно быть сначала изменено на совокупность list, затем, если необходимо, только уникальные значения списка преобразуют значения в наборы и обратно в списки, а из других столбцов создайте DataFrame, который join ed дляназад:

grouped = df.groupby(['ID1','ID1','ID2']).agg(list)

grouped['info'] = grouped['info'].apply(lambda x: list(set(x)))

df1 = pd.DataFrame(grouped.pop('Value').values.tolist(),
                   index=grouped.index).add_prefix('Value')
grouped = grouped.join(df1)
print (grouped)
                 info  Value0  Value1  Value2  Value3
ID1 ID1 ID2                                          
1   1   50       [BA]     101     102     NaN     NaN
2   2   100  [BA, CA]       3       7     9.0    10.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...