【问题标题】:Pandas or Numpy: how to get matching data entries to do data manipulationPandas 或 Numpy:如何获取匹配的数据条目以进行数据操作
【发布时间】:2018-12-19 02:48:49
【问题描述】:

例如,假设我有两个这样的数据关系:

Data1:
   C1      C2
"Peter"  "kiwi"
"John"   "banana"
"Susan"  "peach"
"Joe"    "apple"

Data2:
   C3      C4
"apple"     4 
"banana"    7
"apple"     4

对于 data1 中的每一行,我想找到公共属性上的所有可能匹配项(比如在 Data1[C2] 和 Data2[C3] 之间),并对找到的所有匹配项的 Data2[C4] 值求和。

更具体地说,我希望得到的计算结果如下:

"Peter":  0 (no match for "kiwi")
"John":   7 (one match for "banana", it's just 7)
"Susan":  0 (no match for "peach")
"Joe":    8 (two matches for "apple", they're 4+4)

如何使用 pandas 数据框或 numpy 高效地完成此任务?

非常感谢您的帮助。在获得有关此问题所涉及的技术细节的更多信息后,我将编辑问题标题以使其更具相关性。

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    一种方法是用户mergegroupby

    data1.merge(data2, left_on='C2', right_on='C3', how='left')[['C1', 'C4']]\
         .fillna(0)\
         .groupby('C1')\
         .sum()
    

    输出:

            C1   C4
    0    "Joe"  8.0
    1   "John"  7.0
    2  "Peter"  0.0
    3  "Susan"  0.0
    

    获取字典输出:

    data1.merge(data2, left_on='C2', right_on='C3', how='left')[['C1', 'C4']]\
         .fillna(0)\
         .groupby('C1')\
         .sum()\
         .T\
         .to_dict('r')
    

    输出:

    [{'"Joe"': 8.0, '"John"': 7.0, '"Peter"': 0.0, '"Susan"': 0.0}]
    

    另一种方法是使用mapsum

    data1['Score'] = data1['C2'].map(data2.set_index('C3', append=True)\
                                .sum(level=1)['C4']).fillna(0)
    data1[['C1', 'Score']]
    

    输出:

            C1  Score
    0  "Peter"    0.0
    1   "John"    7.0
    2  "Susan"    0.0
    3    "Joe"    8.0
    

    评论补充:

    data1.merge(data2.rename_axis('d2_idx').reset_index(), left_on='C2', right_on='C3', how='left')\
         .groupby('C1')['d2_idx','C4']\
         .agg({'d2_idx':lambda x: ', '.join(x.astype(str)), 'C4':'sum'})
    

    输出:

               d2_idx   C4
    C1                    
    "Joe"    0.0, 2.0  8.0
    "John"        1.0  7.0
    "Peter"       nan  0.0
    "Susan"       nan  0.0
    

    【讨论】:

    • @masteryiiiintraining 这个解决方案对您有帮助吗?
    • 嘿,是的,绝对 - 非常感谢!我是 Stack Overflow 的新手,所以尽管投票赞成,但我忘了打勾。我确实有一个后续问题:有没有什么方法可以在计算上面的聚合总和时构建一个 data1[C4] 中的值的字典,映射到与 data2 匹配的索引列表?我想我知道如何分别完成这两项任务,但想知道是否有一种有效的方法可以在两者之间使用共享计算。
    • @MasterYiiinTraining 像这样?请参阅上述解决方案中的附加组件。谢谢。
    • 所以计算匹配索引的步骤被排除在我的运行时评估之外,但计算总和的步骤需要包含在我的运行时评估中。虽然上述插件可以同时高效地执行这两项任务,但是否有一些方法可以根据预先计算的匹配索引计算求和任务(以减少计算总和的时间)?
    • Hrm... 好问题。让我再看看这个。如果我想出什么我会更新的。但是,考虑到这一点,也许您可​​以通过发布一个新的后续问题来获得更好的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-05-04
    • 2017-12-18
    • 2021-05-12
    • 2021-04-08
    • 2019-12-21
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多