即使在熊猫中没有值时也创建额外的行
我有一个看起来像这样的数据框:
Person Day Value
1 Mon 32
1 Tue 30
1 Wed 34
1 Thu 22
1 Fri 43
2 Mon 22
2 Wed 14
2 Fri 11
3 Tue 13
3 Wed 22
3 Thu 23
该数据集查看一组人每个工作日(周一至周五)的值。有些人有整整 5 天(例如第 1 个人),有些人只有几天。我想创建新的空行,以便每个人都有完整的 5 天,即使他们没有价值。
这是我想要的输出:
Person Day Value
1 Mon 32
1 Tue 30
1 Wed 34
1 Thu 22
1 Fri 43
2 Mon 22
2 Tue Nan
2 Wed 14
2 Thu Nan
2 Fri 11
3 Mon Nan
3 Tue 13
3 Wed 22
3 Thu 23
3 Fri Nan
我试图写一些东西,但我不知道如何让它正确地遍历每个人:
days = ['mon','tue','wed','thu','fri']
def normalise(person):
newperson = pd.DataFrame()
for day in days:
if day in person:
newperson[day] = days
else:
newperson[day] = np.nan
return newperson
normalised = normalise(df)
这只会生成天数,但不包含其他值。实际数据集大约有 200,000 人。任何想法都会很棒,谢谢!
回答
unstack并stack返回dropna=False:
days = ['Mon','Tue','Wed','Thu','Fri']
out = (df.set_index(['Person','Day'])['Value'].unstack()
.reindex(days ,axis=1)
.stack(dropna=False).reset_index(name='Value'))
Person Day Value
0 1 Mon 32.0
1 1 Tue 30.0
2 1 Wed 34.0
3 1 Thu 22.0
4 1 Fri 43.0
5 2 Mon 22.0
6 2 Tue NaN
7 2 Wed 14.0
8 2 Thu NaN
9 2 Fri 11.0
10 3 Mon NaN
11 3 Tue 13.0
12 3 Wed 22.0
13 3 Thu 23.0
14 3 Fri NaN