【问题标题】:How to divide one column by another where one dataframe's column value corresponds to another dataframe's column's value in Python Pandas?如何将一列除以另一列,其中一个数据框的列值对应于 Python Pandas 中另一个数据框的列值?
【发布时间】:2021-04-28 12:43:41
【问题描述】:

考虑 Python Pandas 中的以下数据框:

数据帧A

ColA ColB ColC
1 dog 439
1 cat 932
1 frog 932
2 dog 2122
2 cat 454
2 frog 773
3 dog 9223
3 cat 3012
3 frog 898

数据框B

ColD ColE
1 101
2 314
3 124

请注意,ColB 只是在 ColA 向上迭代时重复它的字符串值。 ColC 和 ColE 是随机的。 ColA 和 ColD 对应。 ColD 值永远不会有重复(如地图)。

我想在 ColA == ColD 的地方将 ColC 除以 ColE,理想情况下将结果值放在 DataframeA 的新列中(或者只是让它覆盖 ColC)。结果值应该可以有小数。

如何在 Python Pandas 中做到这一点?

【问题讨论】:

    标签: python python-3.x pandas dataframe data-science


    【解决方案1】:

    你可以使用.map

    如果您有多个键可以加入,那么merge 会更有用,正如@anky 所展示的那样

    df1['ColF'] = df1['ColC'] / df1['ColA'].map(df2.set_index(['ColD'])['ColE'])
    
    ColA   ColB  ColC       ColF
    0     1   dog    439   4.346535
    1     1   cat    932   9.227723
    2     1  frog    932   9.227723
    3     2   dog   2122   6.757962
    4     2   cat    454   1.445860
    5     2  frog    773   2.461783
    6     3   dog   9223  74.379032
    7     3   cat   3012  24.290323
    8     3  frog    898   7.241935
    

    【讨论】:

      【解决方案2】:

      IIUC,您可以先合并再除,仅用于下面的新 df 使用,否则使用 @Manakin 的 answer

      out = (df_a.merge(df_b,left_on='ColA',right_on='ColD',how='left')
      .assign(new=lambda x:x['ColC'].div(x['ColE'])).reindex(columns=[*df_a.columns]+['new']))
      

      print(out)
      
         ColA  ColB  ColC        new
      0     1   dog   439   4.346535
      1     1   cat   932   9.227723
      2     1  frog   932   9.227723
      3     2   dog  2122   6.757962
      4     2   cat   454   1.445860
      5     2  frog   773   2.461783
      6     3   dog  9223  74.379032
      7     3   cat  3012  24.290323
      8     3  frog   898   7.241935
      

      【讨论】:

      • 如果除了ColA 之外还有更多的键可以加入的话,这个解决方案感觉有点复杂?
      • @Manakin 抱歉没听懂你,left_onright_on 支持列名列表。或者如果有匹配的列名,那么可以使用后缀 arg:(df_a.merge(df_b,left_on='ColA',right_on='ColD',how='left',suffixes=('','_y')) .assign(new=lambda x:x['ColC'].div(x['ColE'])).reindex(columns=[*df_a.columns]+['new'])) 这样它就可以保留原始名称并重新索引工作
      • 啊抱歉,我的意思是 keys 在多个列中加入,分配和 div/reindex 感觉有点复杂。
      • @Manakin 那么你可能不得不把它分成多行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2019-04-22
      • 2020-11-26
      相关资源
      最近更新 更多