我有一个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工具是否有一种简单的方法。
答案 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)
现在将您的索引设置为period
和id
,并确保您拥有唯一索引:
>>> 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