添加/更新/合并原始数据帧到分组数据帧中

时间:2021-07-02 20:23:35

标签: python pandas dataframe pandas-groupby

如何正确合并、更新、连接、合并或过滤原始 DF,以便我可以拥有完整的 78 列?

我有一个 22 行 78 列的 DataFrame。可以在 here 找到该文件的 Internet 友好版本。这是一个示例:

item_no     code            group   gross_weight    net_weight  value   ... ... +70 columns more
1           7417.85.24.25   0       18              17          13018.74
2           1414.19.00.62   1       35              33          0.11
3           7815.80.99.96   0       49              48          1.86
4           1414.19.00.62   1       30              27          2.7
5           5867.21.36.92   1       31              24          94
6           9227.71.84.12   1       24              17          56.4
7           1414.19.00.62   0       42              35          0.56
8           4465.58.84.31   0       50              42          0.94
9           1596.09.32.64   1       20              13          0.75
10          2194.64.27.41   1       38              33          1.13
11          1596.09.32.64   1       53              46          1.9
12          1596.09.32.64   1       18              15          10.44
13          1596.09.32.64   1       35              33          15.36
14          4835.09.81.44   1       55              47          10.44
15          5698.44.72.13   1       51              49          15.36
16          5698.44.72.13   1       49              45          2.15
17          5698.44.72.13   0       41              33          16
18          3815.79.80.69   1       25              21          4
19          3815.79.80.69   1       35              30          2.4
20          4853.40.53.94   1       53              46          3.12
21          4853.40.53.94   1       50              47          3.98
22          4853.40.53.94   1       16              13          6.53

列组告诉我应该将代码列中的所有相似值分组并在列中添加值:“gross_weight”、“net_weight”、“value”和“item_quantity”。此外,我必须修改 2 个附加列,如下所示:

#Group DF
grouped_df = df.groupby(['group', 'code'], as_index=False).agg({'item_quantity':'sum', 'gross_weight':'sum','net_weight':'sum', 'value':'sum'}).copy()

#Total items should be equal to the length of the DF
grouped_df['total_items'] = len(grouped_df)

#Item No.
grouped_df['item_no'] = [x+1 for x in range(len(grouped_df))]

结果如下:

    group   code            item_quantity   gross_weight    net_weight  value       total_items     item_no
0   0       1414.19.00.62   75.0            42              35          0.56        14              1
1   0       4465.58.84.31   125.0           50              42          0.94        14              2
2   0       5698.44.72.13   200.0           41              33          16.0        14              3
3   0       7417.85.24.25   1940.2          18              17          13018.74    14              4
4   0       7815.80.99.96   200.0           49              48          1.86        14              5
5   1       1414.19.00.62   275.0           65              60          2.81        14              6
6   1       1596.09.32.64   515.0           126             107         28.45       14              7
7   1       2194.64.27.41   151.0           38              33          1.13        14              8
8   1       3815.79.80.69   400.0           60              51          6.4 18      14              9
9   1       4835.09.81.44   87.0            55              47          10.44       14              10
10  1       4853.40.53.94   406.0           119             106         13.63       14              11
11  1       5698.44.72.13   328.0           100             94          17.51       14              12
12  1       5867.21.36.92   1000.0          31              24          94.0        14              13
13  1       9227.71.84.12   600.0           24              17          56.4        14              14

分组 DF 中的所有列都存在于原始 DF 中,但有些列具有不同的值。

如何正确合并、更新、连接、合并或过滤原始 DF,以便我可以拥有完整的 78 列?

  • 目标 DataFrame 是分组的 DF。
  • 原始 DF 中已存在于分组 DF 中的列应被省略。
  • 我应该能够获取原始 DF 中不在分组 DF 中的列的第一个值。
  • 列代码没有唯一值。
  • 完整文件中的 part_number 列没有唯一值。

我试过了:

  • pd.Merge(how='left') 创建唯一 ID 后;它复制现有列,而不是更新值或覆盖。
  • join、concat、update:没有产生预期的结果。
  • .agg({lambda x: x.iloc[0]}) 添加所有列,但我不知道如何将其添加到当前 .agg({'item_quantity':'sum', 'gross_weight':'sum','net_weight':'sum', 'value':'sum'})
  • 我知道 .agg({'column_name':'first']) 返回第一个值,但我不知道如何让它自动处理超过 70 列。

1 个答案:

答案 0 :(得分:0)

您可以实现这一点,动态创建具有列表理解的字典,如下所示:

df.groupby(['group', 'code'], as_index=False).agg({col : 'sum' for col in df.columns[3:]}

如果 item_no 是您的索引,则将 df.columns[3:] 更改为 df.columns[2:]