【问题标题】:How to find sum of values in a column after mapping from another dataframe?从另一个数据帧映射后,如何在列中查找值的总和?
【发布时间】:2021-10-30 15:32:52
【问题描述】:

我有两个数据框如下:

df1 = pd.DataFrame({'Name': ["cat", "dog", "fish"],
    'Set1': ["ad, cd, bd", "bd", "jk, md"],
    'Set2': ["kl, kd", "ad, kd", "kd"],
    'Set3': ["kd, ad", "jk", "bd"]})

df1

Name    set1        set2    set3
cat     ad, cd, bd  kl, kd  kd, ad
dog     bd          ad, kd  jk
fish    jk, md      kd      bd

第二个数据框:

df2 = pd.DataFrame({'Term': ["ad", "cd", "bd", "jk", "md", "kl", "kd", "mm", "nn"], 'Freq': [3,5,3,6,1,4,9,4,2]})

df2

Term    Freq
ad      3
cd      5
bd      3
jk      6
md      1
kl      4
kd      9
mm      4
nn      2

我想将 df2 的值 Freq 映射到 df1 并找到该特定列中值的总和。预期输出为:

Name    set1    set2    set3
cat     11      13      12
dog     3       12      6
fish    7       9       3

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    创建一个分割每个单元格的函数,去掉空格,通过 df2 将文本转换为数字,然后求和:

    def func(val):
        # val = map(str.strip,  val.split(","))
        val = [ent.strip() for ent in val.split(",")]
        val = map(mapper.get, val)
        return sum(val)
    
    
     mapper = dict(zip(df2.Term, df2.Freq))
    
    df1.set_index('Name').applymap(func)
    
          Set1  Set2  Set3
    Name
    cat     11    13    12
    dog      3    12     6
    fish     7     9     3
    

    当然这里的假设是所有条目都在df2中

    【讨论】:

      【解决方案2】:

      这是一个矢量化版本,能够处理df2 中缺失的条目:

      (df1.set_index('Name')
          .stack()
          .str.split(r',\s*')      # allow various number of whitespaces after comma
          .explode()
          .map(df2.set_index('Term')['Freq'])
          .fillna(0, downcast='infer')             # treat missing entry in df2 as 0
          .groupby(level=[0,1])                    # group on `Name` and `Set*`
          .sum()
          .unstack()
      ).reset_index()
      

      结果

         Name  Set1  Set2  Set3
      0   cat    11    13    12
      1   dog     3    12     6
      2  fish     7     9     3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-10
        • 1970-01-01
        • 2017-04-20
        • 2023-03-15
        • 2021-03-26
        • 2023-03-21
        • 2019-10-17
        • 1970-01-01
        相关资源
        最近更新 更多