假设我有以下数据框df1
:
A B C D
0 foo one 1 0
1 bar two 2 1
2 foo two 3 0
3 bar two 4 1
4 foo two 5 0
5 bar two 6 1
6 foo one 7 0
7 foo two 8 1
我想将其转换为数据帧df2
,如下所示:
A B C D
foo [one,two] [1,3,5,7,8] 0
bar [two] [2,4,6] 1
更确切地说:
按A
分组,即列A
是索引,每行A
的值都是唯一的
列B
和C
包含发生的汇总值集。对于A = "foo"
,B
为"one"
或"two"
,而"bar"
仅为"two"
。
set
,但我也想问用pandas代表这个最优雅的方式是什么列D
不包含集,因为foo
D
始终为0而bar
始终为1.如果始终为1 :索引值与列值之间的1个关系,则该列不应包含集。
我预计会有一个单行聚合la df1.groupby("A").aggregate_like_this()
,但到目前为止我没有运气。
答案 0 :(得分:2)
使用groupby
+ agg
:
f = {'B' : lambda x: np.unique(x).tolist(),
'C' : lambda x: np.unique(x).tolist(),
'D' : 'first'
}
df.groupby('A', as_index=False).agg(f).reindex(columns=df.columns)
A B C D
0 bar [two] [2, 4, 6] 1
1 foo [one, two] [1, 3, 5, 7, 8] 0
如果您无法事先确定A
与D
有1:1关系的值,请使用groupby
+ nunique
进行检查,然后相应地过滤数据集
x = df.groupby('A').D.nunique().eq(1)
df = df[df.A.isin(x[x].index)]
df
A B C D
1 bar two 2 1
3 bar two 4 1
5 bar two 6 1
df.groupby('A', as_index=False).agg(f).reindex(columns=df.columns)
A B C D
0 bar [two] [2, 4, 6] 1