映射两个数据框并使用字典执行求和运算

时间:2019-07-03 21:53:10

标签: python pandas dataframe dictionary data-analysis

我有一个数据框 df

df

   Object        Action  Cost1  Cost2
0     123      renovate  10000   2000
1     456  do something      0     10
2     789        review   1000     50

词典(称为字典)

dictionary

{'Object_new': ['Object'],
 'Action_new': ['Action'],
 'Total_Cost': ['Cost1', 'Cost2']}

此外,我有一个(开头为空)数据帧 df_new ,该数据帧应包含与df几乎相同的信息,除了列名需要不同(根据字典命名)和df中的某些列应基于字典进行合并(例如,求和运算)。

结果应如下所示:

df_new

   Object_new    Action_new  Total_Cost
0         123      renovate       12000
1         456  do something          10
2         789        review        1050

如何仅使用字典来达到此结果?我尝试使用.map()函数,但无法弄清楚如何使用它执行求和运算。

附加了用于重现数据帧和字典的代码:

# import libraries
import pandas as pd


### create df
data_df = {'Object':  [123, 456, 789],
        'Action': ['renovate', 'do something', 'review'],
        'Cost1': [10000, 0, 1000],
        'Cost2': [2000, 10, 50],
        }

df = pd.DataFrame(data_df)


### create dictionary
dictionary = {'Object_new':['Object'], 
              'Action_new':['Action'], 
              'Total_Cost' : ['Cost1', 'Cost2']}


### create df_new
# data_df_new = pd.DataFrame(columns=['Object_new', 'Action_new', 'Total_Cost' ])
data_df_new = {'Object_new':  [123, 456, 789],
        'Action_new': ['renovate', 'do something', 'review'],
        'Total_Cost': [12000, 10, 1050],
        }
df_new = pd.DataFrame(data_df_new)

4 个答案:

答案 0 :(得分:2)

groupby一起玩:

inv_dict = {x:k for k,v in dictionary.items() for x in v}
df_new =  df.groupby(df.columns.map(inv_dict),
                     axis=1).sum()

输出:

     Action_new  Object_new  Total_Cost
0      renovate         123       12000
1  do something         456          10
2        review         789        1050

答案 1 :(得分:1)

鉴于您算法的复杂性,我建议执行Series加法运算来解决此问题。

为什么?在Pandas中,DataFrame中的每一列都在内部充当Series

data_df_new = {
    'Object_new': df['Object'],
    'Action_new': df['Action'],
    'Total_Cost': (df['Cost1'] + df['Cost2'])  # Addition of two series
}

df_new = pd.DataFrame(data_df_new)

运行此代码将映射数据集中包含的每个值,这些值将存储在我们的字典中。

答案 2 :(得分:1)

您可以使用空的数据框复制新列,并使用to_dict将其转换为字典。

import pandas as pd
import numpy as np

data_df = {'Object':  [123, 456, 789],
        'Action': ['renovate', 'do something', 'review'],
        'Cost1': [10000, 0, 1000],
        'Cost2': [2000, 10, 50],
        }

df = pd.DataFrame(data_df)
print(df) 
MyEmptydf = pd.DataFrame()
MyEmptydf['Object_new']=df['Object']
MyEmptydf['Action_new']=df['Action']
MyEmptydf['Total_Cost'] = df['Cost1'] + df['Cost2']

print(MyEmptydf) 
dictionary = MyEmptydf.to_dict(orient="index")
print(dictionary) 

您可以在此处运行代码:https://repl.it/repls/RealisticVillainousGlueware

答案 3 :(得分:1)

如果您尝试完全避免使用熊猫,而只使用字典,那应该可以解决

Object = []
totalcost = []
action = []
for i in range(0,3):
    Object.append(data_df['Object'][i])
    totalcost.append(data_df['Cost1'][i]+data_df['Cost2'][i])
    action.append(data_df['Action'][i])
dict2  = {'Object':Object, 'Action':action, 'TotalCost':totalcost}