使用字典键循环数据帧行,并在匹配时输出值

2024-05-16 14:27:07 发布

您现在位置:Python中文网/ 问答频道 /正文

字典-

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)出现在dataframe行中,那么输出应该是一个值为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)

现在不确定如何循环dataframe并创建新列

欢迎任何其他方法

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


Tags: 数据idappledataframedf字典pdguava
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

首先,我们使用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

另一种方法是使用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

相关问题 更多 >