熊猫:数据框到不平衡面板的字典

时间:2016-02-12 02:39:37

标签: python dictionary pandas dataframe

我有一个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中。但是,有两种不同的“Annas”。

在这些数据框架中,人数和人数随时间而变化。有些人在所有日期都有代表,其他人只在特定的日期出现。

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

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

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

1 个答案:

答案 0 :(得分: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