【问题标题】:Pandas: Dict of data frames to unbalanced Panel熊猫:不平衡面板的数据帧字典
【发布时间】:2016-02-12 02:39:36
【问题描述】:

我有一个 DataFrame 对象字典:

dictDF={0:df0,1:df1,2:df2}

每个DataFrame df0,df1,df2 代表一个特定时间日期的表,其中第一列标识(如社会安全号码)一个人,其他列是此人的特征,例如

DataFrame df0

id Name      Age Gender Job        Income
10 Daniel    40  Male   Scientist  100
5  Anna      39  Female Doctor     250

DataFrame df1

id  Name      Age Gender  Job        Income 
67  Guto      35  Male    Engineer   100 
7   Anna      39  Female  Doctor     300
9   Melissa   26  Female  Student    36

DataFrame df2

id    Name     Age Gender Job     Income 
77 Patricia    30  Female Dentist 300 
9  Melissa     27  Female Dentist 250

请注意,id(社会安全号码)可准确识别此人。例如,相同的“Melissa”出现在两个不同的 DataFrame 中。但是,有两个不同的“安娜”。

在这些数据帧中,人数和人数随时间而变化。有些人在所有日期都有代表,而另一些人只在特定的时间日期代表。

是否有一种简单的方法可以在(不平衡的)Panel 对象中转换此数据帧字典,其中 id 出现在所有日期中,如果给定 id 的数据不可用,则将其替换为 NaN?

当然,我可以创建一个所有 id 的列表,然后检查每个日期是否表示给定的 id。如果它被表示,那么我复制数据。否则,我只写 NaN。

我想知道是否有使用 pandas 工具的简单方法。

【问题讨论】:

    标签: python dictionary pandas dataframe


    【解决方案1】:

    我建议使用 MultiIndex 而不是 Panel。

    首先,将句点添加到每个数据帧:

    for n, df in dictDF.iteritems():
        df['period'] = n
    

    然后连接成一个大数据框:

    big_df = pd.concat([df for df in dictDF.itervalues()], ignore_index=True)
    

    现在将您的索引设置为periodid,保证您拥有唯一的索引:

    >>> big_df.set_index(['period', 'id'])
                   Name  Age  Gender        Job  Income
    period id                                          
    0      10    Daniel   40    Male  Scientist     100
           5       Anna   39  Female     Doctor     250
    1      67      Guto   35    Male   Engineer     100
           7       Anna   39  Female     Doctor     300
           9    Melissa   26  Female    Student      36
    2      77  Patricia   30  Female    Dentist     300
           9    Melissa   27  Female    Dentist     250
    

    您也可以颠倒该顺序:

    >>> big_df.set_index(['id', 'period']).sort_index()
                   Name  Age  Gender        Job  Income
    id period                                          
    5  0           Anna   39  Female     Doctor     250
    7  1           Anna   39  Female     Doctor     300
    9  1        Melissa   26  Female    Student      36
       2        Melissa   27  Female    Dentist     250
    10 0         Daniel   40    Male  Scientist     100
    67 1           Guto   35    Male   Engineer     100
    77 2       Patricia   30  Female    Dentist     300
    

    您甚至可以很容易地取消堆叠数据:

    big_df.set_index(['id', 'period'])[['Income']].unstack('period')
            Income          
    period       0    1    2
    id                      
    5          250  NaN  NaN
    7          NaN  300  NaN
    9          NaN   36  250
    10         100  NaN  NaN
    67         NaN  100  NaN
    77         NaN  NaN  300
    

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 2020-08-22
      • 2020-06-07
      • 1970-01-01
      • 2014-10-30
      • 2017-02-21
      • 2021-07-17
      • 2016-10-17
      相关资源
      最近更新 更多