假设以下df:
df = pd.DataFrame(
{
'col 1': ['A', 'A', 'B', 'B', 'C'],
'col 2': ['c2', 'd2', 'e2', 'f2', 'g2'],
'col 3': ['c3', 'd3', 'e3', 'f3', 'g3'],
'col 4': ['c4', 'd4', 'e4', 'f4', 'g4'],
}
)
所需的输出是:
col 1 col 2 col 3
A c2;d2 c3;d3
B e2;f2 e3;f3
C g2 g3
我已通过以下方式成功完成了此任务:
df = df.groupby('col 1').transform( lambda x: ';'.join(x)).drop_duplicates()
问题在于此方法不会保留我真正需要的第1列。而且我无法让apply
工作。我已经尝试过这种方法,但是在。groupby
之后似乎不起作用。
apply(lambda x: '*'.join(x.dropna().values.tolist()), axis=1)
答案 0 :(得分:5)
我认为您可以使用功能DataFrameGroupBy.agg
在groupby
之后指定列表中的列,lambda function
是不必要的:
df1 = df.groupby('col 1')['col 2','col 3'].agg(';'.join).reset_index()
#alternative
#df1 = df.groupby('col 1', as_index=False)['col 2','col 3'].agg(';'.join)
print (df1)
col 1 col 2 col 3
0 A c2;d2 c3;d3
1 B e2;f2 e3;f3
2 C g2 g3
如果还要删除缺失的值:
df = pd.DataFrame(
{
'col 1': ['A', 'A', 'B', 'B', 'C'],
'col 2': [np.nan, 'd2', 'e2', 'f2', 'g2'],
'col 3': ['c3', 'd3', 'e3', 'f3', 'g3'],
'col 4': ['c4', 'd4', 'e4', 'f4', 'g4'],
}
)
print (df)
col 1 col 2 col 3 col 4
0 A NaN c3 c4
1 A d2 d3 d4
2 B e2 e3 e4
3 B f2 f3 f4
4 C g2 g3 g4
df1 = (df.groupby('col 1', as_index=False)['col 2','col 3']
.agg(lambda x: ';'.join(x.dropna())))
print (df1)
col 1 col 2 col 3
0 A d2 c3;d3
1 B e2;f2 e3;f3
2 C g2 g3
答案 1 :(得分:4)
在col 1
上分组(将索引指定为false,使其保留为列)。将lambda应用于每个组,并在其中使用分号将每个组的值连接在一起。然后按照所需的列顺序(例如第1-3列)对结果进行排序。
df = pd.DataFrame(
{'col 1': ['A', 'A', 'B', 'B', 'C'],
'col 2': ['c2', 'd2', 'e2', 'f2', 'g2'],
'col 3': ['c3', 'd3', 'e3', 'f3', 'g3'],
'col 4': ['c4', 'd4', 'e4', 'f4', 'g4']})
>>> df.groupby('col 1', as_index=False).agg(
{'col 2': lambda x: ';'.join(x),
'col 3': lambda x: ';'.join(x)})[['col 1', 'col 2', 'col 3']]
col 1 col 2 col 3
0 A c2;d2 c3;d3
1 B e2;f2 e3;f3
2 C g2 g3