【问题标题】:Capturing values of variables across dataframes from a dict of dataframes in python从python中的数据帧字典中捕获跨数据帧的变量值
【发布时间】:2018-11-01 08:34:49
【问题描述】:

我在 dict 中有 3 个数据框,其中键是月份标识符,值是数据框:

下面是数据帧和键的快照:

现在,对于每个唯一变量,我想捕捉它在所有月份/数据帧中的相关强度。 如果变量在 df 中具有相关值,则应捕获该值,否则该值将为 0。类似于 excel 中的 VLOOKUP。

最终的数据框如下所示:

这对我来说在 python 中实现似乎非常复杂,所以有人可以帮我解决这个问题吗?

以下是生成示例数据并创建数据帧字典的代码:

import pandas as pd
import numpy as np

df1 = pd.DataFrame([{'Variable_Name':'Pending_Disconnect','correlation': 0.553395448},
                    {'Variable_Name':'status_Active','correlation': 0.539464806},
                    {'Variable_Name':'days_active','correlation':0.414774231},
                    {'Variable_Name':'days_pend_disco','correlation':0.392915837},
                    {'Variable_Name':'prop_tenure','correlation':0.074321692},
                    {'Variable_Name':'abs_change_3m','correlation':0.062267386}
                    ])


df2 = pd.DataFrame([{'Variable_Name':'Pending_Change','correlation': 0.043461995},
                    {'Variable_Name':'status_Active','correlation': 0.038057697},
                    {'Variable_Name':'ethnic','correlation':0.037503202},
                    {'Variable_Name':'days_active','correlation':0.037227245},
                    {'Variable_Name':'archetype_grp','correlation':0.035761434},
                    {'Variable_Name':'age_nan','correlation':0.035761434}
                    ])


df3 = pd.DataFrame([{'Variable_Name':'active_frq_N','correlation':0.025697016},
                    {'Variable_Name':'active_frq_Y','correlation': 0.025697016},
                    {'Variable_Name':'ethnic','correlation':0.025195149},
                    {'Variable_Name':'ecgroup','correlation':0.023192408},
                    {'Variable_Name':'age','correlation':0.023121305},
                    {'Variable_Name':'archetype_nan','correlation':0.023121305}
                    ])

dfs = [df1,df2,df3]
months = ['Jan - Feb 2018','Jan - Mar 2018','Jan - Apr 2018']

sample_dict = dict(zip(months,dfs))

【问题讨论】:

    标签: python pandas dataframe unique


    【解决方案1】:

    您可以替换数据框的列名,然后使用pd.concat 连接数据框。

    for key, df in sample_dict.items():
        df.rename(columns={'correlation':'correlation '+ key}, inplace=True)
    pd.concat(dfs)
    

    编辑:您也可以省略字典并从数据框列表中执行此操作。

    for i, df in enumerate(dfs):
        df.rename(columns={'correlation':'correlation '+ months[i]}, inplace=True)
    pd.concat(dfs)  
    

    【讨论】:

    • Hello @onno.. 这会引发以下错误:AttributeError: 'dict' object has no attribute 'iteritems'
    • @ShuvayanDas .iteritems() 是 Python 2.x 的东西,在 3.x 中被删除...改用.items()
    • 哎呀,我在我的 Python 2 环境中运行。我编辑了我的答案
    【解决方案2】:

    将pd.concat 用作:

    df1.set_index('Variable_Name',inplace=True)
    df2.set_index('Variable_Name',inplace=True)
    df3.set_index('Variable_Name',inplace=True)
    
    df = pd.concat([df1,df2,df3], axis=1, sort=False).fillna(0)
    df.reset_index(inplace=True)
    df.columns = ['Variable_Name','Jan - Feb 2018','Jan - Mar 2018','Jan - Apr 2018']
    
    print(df)
             Variable_Name  Jan - Feb 2018  Jan - Mar 2018  Jan - Apr 2018
    0   Pending_Disconnect        0.553395        0.000000        0.000000
    1        status_Active        0.539465        0.038058        0.000000
    2          days_active        0.414774        0.037227        0.000000
    3      days_pend_disco        0.392916        0.000000        0.000000
    4          prop_tenure        0.074322        0.000000        0.000000
    5        abs_change_3m        0.062267        0.000000        0.000000
    6       Pending_Change        0.000000        0.043462        0.000000
    7               ethnic        0.000000        0.037503        0.025195
    8        archetype_grp        0.000000        0.035761        0.000000
    9              age_nan        0.000000        0.035761        0.000000
    10        active_frq_N        0.000000        0.000000        0.025697
    11        active_frq_Y        0.000000        0.000000        0.025697
    12             ecgroup        0.000000        0.000000        0.023192
    13                 age        0.000000        0.000000        0.023121
    14       archetype_nan        0.000000        0.000000        0.023121
    

    【讨论】:

      【解决方案3】:

      我的最终代码是@onno 和@Sandeep Kadapa 的代码组合:

      final_df = pd.DataFrame()
      for key, df in sample_dict.items():
              df = sample_dict[key]
              df = df.iloc[:,0:2]
              df.rename(columns={'correlation':'correlation '+ key}, inplace=True)
              final_df = pd.concat([final_df,df],axis = 1,sort = False).fillna(0)
      

      非常感谢您的快速回复。

      【讨论】:

        猜你喜欢
        • 2016-04-28
        • 2021-03-22
        • 2019-08-12
        • 2021-12-29
        • 2015-08-31
        • 1970-01-01
        • 2020-02-02
        • 1970-01-01
        • 2016-07-12
        相关资源
        最近更新 更多