python - 即使 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 人。任何想法都会很棒,谢谢!
解决方案
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
推荐阅读
- c# - 找不到类型或命名空间名称“SortedSet”
- python - numpy数组中两组值之间的距离
- perl - Perl Mojolicious 存储转储
- javascript - Rxjs:使用 bufferCount 时如何获取最后一个值
- django - 特定模型的 Django 组权限
- python-3.x - 如何修复 Python 3 中的“import asammdf”错误
- javascript - 如何从对象列表中创建键值对象
- python - EVE - POST 请求时出现 500 内部服务器错误
- python - 这个 powerset 函数的时间复杂度是多少?
- swift - 无法在 ARKit 中旋转 SCNNode