【问题标题】:Map two dataframes and perform sum operation using a dictionary映射两个数据帧并使用字典执行求和运算
【发布时间】:2019-07-03 21:53:10
【问题描述】:

我有一个数据框 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)

【问题讨论】:

    标签: python pandas dataframe dictionary data-analysis


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      考虑到您算法的复杂性,我建议执行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)
      

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

      【讨论】:

        【解决方案3】:

        您可以使用空数据框复制新列并使用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

        【讨论】:

          【解决方案4】:

          如果你试图完全避免使用 pandas 并且只使用字典,这应该可以解决它

          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} 
          

          【讨论】:

            猜你喜欢
            • 2019-02-23
            • 2021-01-24
            • 1970-01-01
            • 2021-10-21
            • 2019-04-16
            • 1970-01-01
            • 2015-02-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多