【问题标题】:Python pandas Grouping in a different wayPython pandas 以不同的方式分组
【发布时间】:2019-11-24 20:32:33
【问题描述】:

我有许多从 pdf 文件中读取的数据帧。它们看起来像这样:

e.g order 1 - this is a dataframe:
code    description   price   quantity       
000001  product A       1       10
000002  product B       2       20
000003  product C       3       30 
...

order 2 - this is a dataframe:
code    description   price   quantity
000001  product A       1       100
000002  product B       2       20
000004  product D       4       40

会有订单 3、4 等 我喜欢加入他们并按代码分组(这是唯一的)但显示 分开数量。

code    description   price   order1 quantity  order2 quantity
000001  product A       1       10              100
000002  product B       2       20              20
000003  product C       3       30               0 
000004  product D       4        0              40

除了使用繁琐的循环之外,我想知道在 pandas 中是否有更简洁的方法来实现这一点。我以前在 excel vba 中使用丑陋的循环来处理这个,这是我第一次在 pandas 中尝试它。

非常感谢您的帮助!

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以通过DataFrame.set_index 创建MultiIndex Series 或在列表理解中聚合sum,然后通过concat 连接在一起:

dfs = [df1, df2, ..., dfn]

#if triples code, description, price are unique
L = [x.set_index(['code', 'description', 'price'])['quantity'] for x in dfs]

#if triples are not unique and necessary aggregate sum
L = [x.groupby(['code', 'description', 'price'])['quantity'].sum() for x in dfs]

df1 = (pd.concat(L, axis=1, keys=range(1, len(dfs) + 1))
         .add_prefix('quantity')
         .fillna(0)
         .astype(int)
         .reset_index())
print (df1)
     code description  price  quantity1  quantity2
0  000001   product A      1         10        100
1  000002   product B      2         20         20
2  000003   product C      3         30          0
3  000004   product D      4          0         40

编辑:

DataFrame.set_axis 可以为列表理解中的每个 DataFrame 设置默认列名:

L = [x.set_axis(np.arange(len(x.columns)), axis=1, inplace=False).set_index([0,1,2])[3] 
                                             for x in dfs]

【讨论】:

  • 感谢您的意见,在我尝试这些解决方案之前,我需要重新处理我的数据框。你知道如何去除烦人的列索引吗?我的意思是每一行已经有一个索引,所以每一行都被标记为 0 1 2 等。但是我的列有相同的 0、1、2 等?我相信这会阻止我调用 .columns 并给出我的数据框列名。你有什么想法吗?
  • 我无法表达我的感激之情,您在发布我的问题后 10 分钟内就回答了我,这符合我的要求。对我来说,在 excel vba 中执行此操作会花费我一段时间,并且不想走这条路。非常感谢 jezrael senpai。
猜你喜欢
  • 1970-01-01
  • 2013-03-15
  • 2016-06-16
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
相关资源
最近更新 更多