首页 > 解决方案 > 即使 pandas 中没有值也创建额外的行

问题描述

我有一个看起来像这样的数据框:

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 人。任何想法都会很棒,谢谢!

标签: pythonpandas

解决方案


unstackstack返回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

推荐阅读