在Pandas

时间:2017-08-24 08:43:03

标签: python pandas dataframe group-by pandas-groupby

在pandas中,我一直在寻找通过某个列对数据帧进行分组的一般流程,对这些组执行非平凡的操作,然后将这些组重新组合成一个大数据帧(通过有效地将它们堆叠在一起)彼此的)。

想象一下,我有一个DataFrame df

+----+-------+---+---+---+
|    |   A   | B | C | D |
+----+-------+---+---+---+
|  0 | Green | 1 | 4 | 5 |
|  1 | Red   | 2 | 3 | 2 |
|  2 | Red   | 1 | 4 | 3 |
|  3 | Green | 2 | 2 | 2 |
|  4 | Green | 1 | 1 | 1 |
|  5 | Blue  | 2 | 1 | 5 |
|  6 | Red   | 2 | 1 | 6 |
|  7 | Blue  | 7 | 8 | 9 |
|  8 | Green | 7 | 6 | 5 |
|  9 | Red   | 0 | 9 | 0 |
| 10 | Blue  | 4 | 5 | 4 |
+----+-------+---+---+---+

我想将groupby()列A分组,然后对每个组执行操作。通常,此操作涉及通过将所有行中的一行中的值与行中的值进行比较来创建新行,因此我不会说可以使用应用于组的lambda函数来完成。然后,我想将这些组重新组合到数据帧中,有效地采用与上面相同的格式,但插入行。

到目前为止,我的一般做法是“慢慢愚蠢的”#34;方式,即:

group_list = []

g = df.groupby("A")
for i, group in g:

  ###Perform some weird operation on group that can't really be reduced to a 
  #lambda function applied to each group. 

  group_list.append(group)

reconstituted = group_list[0]
for i in range(1,len(group_list)):
  reconstituted = reconstituted.append(group_list[i], ignore_index=True)

显然,这不是特别的熊猫式的,所以这是我的问题 - 什么是对群体本身进行操作然后重构它们的更好方法?

2 个答案:

答案 0 :(得分:0)

如果您不知道自己的功能是什么,如果只想加入它们,就可以使用pd.concat

df_new = pd.concat(group_list)

MVCE:

In [77]: df1
Out[77]: 
   0
0  a
1  b

In [78]: df2
Out[78]: 
   0
0  c
1  d

In [79]: pd.concat([df1, df2], ignore_index=True)
Out[79]: 
   0
0  a
1  b
0  c
1  d

但是,我建议你考虑一种不同的技术,它不涉及明确地拆分组并单独处理它们,这是非常低效的。

答案 1 :(得分:0)

以下代码可以按列A的值

提取值
import pandas as pd

df = pd.DataFrame([{'A': 'Green', 'B': 1}, {'A': 'Red', 'B': 2}, {'A': 'Green', 'B': 3}])

for value in df.A.unique():
    print(df[df.A == value])

如果您不想将它们合并回df,则可以按A列对值进行排序

df.sort_values("A")

您可以获得以下结果:

       A  B
0  Green  1
2  Green  3
1    Red  2