【问题标题】:Pandas grouping rows based on groupings in second dataframePandas 根据第二个数据框中的分组对行进行分组
【发布时间】:2021-06-16 16:41:25
【问题描述】:

我一直在解决一个困扰我一段时间的问题。

简单的解释是我有两个数据帧 df1 和 df2。 df1 包含由单个字符串组成的列 x 和由值组成的列 y。

df2 是包含字符串的单列。这些与 df1 列 x 相同,但其中一些分组为字符串,但用分号“;”分隔。

我要做的是创建另一个数据框,它采用 df1 并对 y 列中的值求和,以生成“结果”数据框。

在 Pandas 中是否有一种简单的方法?

谢谢。

df1
   
    x  y 
0  'a' 5
1  'b' 4
2  'c' 9
3  'd' 1
4  'e' 3
5  'f' 3
6  'g' 4
7  'h' 5
8  'i' 6 
9  'j' 6
10 'k' 9

df2

   group
0  'a'
1  'b;h;d' 
2  'e'
3  'f'
4  'g;c;i'
5  'j'
6  'k'


Result
 
  group     y
0  'a'      5
1  'b;h;d'  10
2  'e'      3
3  'f'      3
4  'g;c;i'  19
5  'j'      6
6  'k'      9
    

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    试试:

    df2 = df2.reset_index()
    df2.group = df2.group.str.split(";")
    df2 = df2.explode("group").merge(df1, left_on="group", right_on="x", how="left")
    out = (
        df2.groupby("index")
        .agg({"x": ";".join, "y": "sum"})
        .rename(columns={"x": "group"})
        .reset_index(drop=True)
    )
    print(out)
    

    打印:

       group   y
    0      a   5
    1  b;h;d  10
    2      e   3
    3      f   3
    4  g;c;i  19
    5      j   6
    6      k   9
    

    【讨论】:

      【解决方案2】:

      最简单的方法是将 group 列从 df2 添加到 df1 以获得 df1x 列中的相应值,然后只需对新添加的列进行分组,并为每个组在 y 列上调用 sum:

      df1['group'] = ''
      for group in df2['group'].values:
          df1.loc[df1['x'].str[1:-1].isin(list(group)), 'group'] = group
      

      输出:

      df1.groupby('group')['y'].sum()
      group
      'a'         5
      'b;h;d'    10
      'e'         3
      'f'         3
      'g;c;i'    19
      'j'         6
      'k'         9
      Name: y, dtype: int64
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2020-08-05
        • 1970-01-01
        • 2012-11-06
        • 2014-04-13
        • 2021-06-03
        • 1970-01-01
        相关资源
        最近更新 更多