将pandas数据帧分组并将多个值收集到集合中

2024-05-16 20:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧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,如下所示:

^{pr2}$

更确切地说:

  • A分组,即列A是索引,每行中{}的值是唯一的

  • BC包含发生的值的聚合集。对于A = "foo"B要么是"one",要么是{},而对{}来说,只有"two"。在

    • 从逻辑上讲,这应该是一个集合,每个发生的值只出现一次。它可能是一条Pythonset,但我也在问,用熊猫来表示这一点最优雅的方式是什么
  • D不包含集合,因为对于fooD总是0,而对于bar,它总是1。如果索引值和列值之间始终存在1:1的关系,则列不应包含集合。

我原以为会有一个单行聚合a df1.groupby("A").aggregate_like_this(),但到目前为止我还没有找到它。在


Tags: 数据foo关系food方式bar逻辑one
1条回答
网友
1楼 · 发布于 2024-05-16 20:34:47

使用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进行检查,然后相应地过滤数据集。在

^{pr2}$

相关问题 更多 >