【问题标题】:Loop through the dataframe row using the dictionary keys and output the value when there is a match使用字典键遍历数据框行并在匹配时输出值
【发布时间】:2020-05-19 18:02:15
【问题描述】:

字典-

theDict = {'Apple': '50',
           'Mango': '70',
           'Banana': '20'}

数据框 -

df=pd.DataFrame({'id':[1,2,3],
         'var1':['Apple','Papaya','Banana'],
          'var2':['Papaya','Mango','Apple'],
         'var3':['Banana','Guava','Grapes']})

如果字典项(例如 Apple)出现在数据框行中,则输出应该是值为 50 的新列。

如果连续有两个水果,例如芒果和苹果,那么该行前面的输出应该是 50 + 70

输出样本 -

df=pd.DataFrame({'id':[1,2,3],
         'var1':['Apple','Papaya','Banana'],
          'var2':['Papaya','Mango','Apple'],
         'var3':['Banana','Guava','Grapes']
          'Output_var':['50','50+70','20']})

如果值存在或不存在,则创建一个值为 True 或 False 的数据框

m = df.isin(theDict)
print (m)

现在不确定,如何循环数据框并创建一个新列。

欢迎任何其他方法!

我正在考虑将数据帧转换为 numpy 数组并使用循环,但我的数据集非常大,不确定这是否是最佳方式

【问题讨论】:

  • 当你说输出应该是50 + 70时,你指的是那个表达式的值吗?
  • @AMC 我也对此感到困惑,但他可能有他只想加入的字符串,他总是可以评估或使用 Erfan 和我自己的解决方案
  • 对不起,我有想要加入的字符串,值并不总是数字

标签: python pandas numpy dictionary


【解决方案1】:

首先我们使用melt 将您的数据取消透视到行。

然后我们使用Series.map 将您的字典映射到水果。

最后我们使用GroupBy.sumjoin

dfm = df.melt('id', ['var1', 'var2', 'var3'])
dfm['Output_var'] = dfm['value'].map(theDict).astype(float)
df = df.set_index('id').join(dfm.groupby('id')['Output_var'].sum()).reset_index()

   id    var1    var2    var3  Output_var
0   1   Apple  Papaya  Banana        70.0
1   2  Papaya   Mango   Guava        70.0
2   3  Banana   Apple  Grapes        70.0

【讨论】:

    【解决方案2】:

    另一种方法是使用 apply 沿轴映射,现在接受 axis 参数。

    df['vals'] = df.select_dtypes("object").apply(lambda x: x.map(theDict), axis=1).fillna(0).astype(
        int
    ).sum(axis=1)
    
       id    var1    var2    var3  vals
    0   1   Apple  Papaya  Banana    70
    1   2  Papaya   Mango   Guava    70
    2   3  Banana   Apple  Grapes    70
    

    如果你只是想加入价值观:

    df['vals'] = df.select_dtypes("object").apply(lambda x: x.map(theDict), axis=1).stack(0).groupby(
        level=0
    ).agg("+".join)
    
    print(df)
       id    var1    var2    var3   vals
    0   1   Apple  Papaya  Banana  50+20
    1   2  Papaya   Mango   Guava     70
    2   3  Banana   Apple  Grapes  20+50
    

    【讨论】:

    • 将所有内容汇总到一行的好方法,谢谢!
    【解决方案3】:

    在每列上使用replace 和生成器表达式(或列表理解)和pd.to_numeric。最后,在生成器表达式的输出上调用sum

    cols = ['var1', 'var2','var3']
    df['output_var'] = sum(pd.to_numeric(col, errors='coerce').fillna(0) 
                                    for col in map(df.replace(theDict).get, cols))
    
    In [27]: df
    Out[27]:
       id    var1    var2    var3  output_var
    0   1   Apple  Papaya  Banana        70.0
    1   2  Papaya   Mango   Guava        70.0
    2   3  Banana   Apple  Grapes        70.0
    

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多