【问题标题】:Grouping, editing, and re-joining groups efficiently in Pandas在 Pandas 中高效地分组、编辑和重新加入组
【发布时间】:2017-08-24 08:43:03
【问题描述】:

在 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 函数来完成。然后,我想将这些组重新组合到数据框中,有效地采用与上述相同的格式,但插入了行。

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

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)

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

【问题讨论】:

  • 不确定你想做什么,但可以按列的值排序吗? df.sort_values("A") 或 df.sort("A")

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


【解决方案1】:

在不知道你的函数做什么的情况下,如果你只想加入它们,你可以使用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

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

【讨论】:

  • 嗨,感谢您的回复 - concat 至少会改进最后几行。
  • 完成。是的,在我尝试了一些方法之后,我将提出一个关于操作 groupby 对象的新问题。
【解决方案2】:

以下代码可以按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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多