Я хочу объединить строки фрейма данных с одним общим значением столбца, а затем объединить остальные значения столбца, разделенные запятой, для строковых значений и преобразовать в массив/список для значений int.
A B C D
1 one 100 value
4 four 400 value
5 five 500 value
2 two 200 value
Ожидаемый результат, например:
A B C D
[1,4,5,2] one,four,five,two [100,400,500,200] value
Я могу использовать groupby для столбца D, но как я могу использовать apply для столбцов A, C как apply(np.array) и apply(','.join) для столбца B в df одновременно?






Динамическое решение - строковые столбцы объединяются, а числовые преобразуются в списки с GroupBy.agg:
f = lambda x: x.tolist() if np.issubdtype(x.dtype, np.number) else ','.join(x)
#similar for test strings - https://stackoverflow.com/a/37727662
#f = lambda x: ','.join(x) if np.issubdtype(x.dtype, np.flexible) else x.tolist()
df1 = df.groupby('D').agg(f).reset_index().reindex(columns=df.columns)
print (df1)
A B C D
0 [1, 4, 5, 2] one,four,five,two [100, 400, 500, 200] value
Другое решение - указать каждую функцию отдельно для каждого столбца:
df2 = (df.groupby('D')
.agg({'A': lambda x: x.tolist(), 'B': ','.join, 'C':lambda x: x.tolist()})
.reset_index()
.reindex(columns=df.columns))
print (df2)
A B C D
0 [1, 4, 5, 2] one,four,five,two [100, 400, 500, 200] value
df = df.groupby('D').apply(lambda x: pd.Series([list(x.A),','.join(x.B),list(x.C)])).reset_index().rename({0:'A',1:'B',2:'C'}, axis=1)
df = df[['A','B','C','D']]
Выход
A B C D
0 [1, 4, 5, 2] one,four,five,two [100, 400, 500, 200] value
Почему бы не однострочник agg:
>>> df.groupby('D', as_index=False).agg(lambda x: x.tolist() if x.dtype != object else ','.join(x))[df.columns]
A B C D
0 [1, 4, 5, 2] one,four,five,two [100, 400, 500, 200] value
>>>