如何解决根据列添加缺失的行
我给出了以下df
df = pd.DataFrame(data = {'day': [1,1,2,3],'pos': 2*[1,14,18],'value': 2*[1,3]}
df
day pos value
0 1 1 1
1 1 14 2
2 1 18 3
3 2 1 1
4 2 14 2
5 3 18 3
我想填写行,以使每一天都有'pos'列的所有可能值
所需结果:
day pos value
0 1 1 1.0
1 1 14 2.0
2 1 18 3.0
3 2 1 1.0
4 2 14 2.0
5 2 18 NaN
6 3 1 NaN
7 3 14 NaN
8 3 18 3.0
主张:
df.set_index('pos').reindex(pd.Index(3*[1,18])).reset_index()
产量:
ValueError: cannot reindex from a duplicate axis
解决方法
让我们先尝试pivot
然后尝试stack
:
df.pivot('day','pos','value').stack(dropna=False).reset_index(name='value')
输出:
day pos value
0 1 1 1.0
1 1 14 2.0
2 1 18 3.0
3 2 1 1.0
4 2 14 2.0
5 2 18 NaN
6 3 1 NaN
7 3 14 NaN
8 3 18 3.0
选项2 :与MultiIndex合并:
df.merge(pd.DataFrame(index=pd.MultiIndex.from_product([df['day'].unique(),df['pos'].unique()])),left_on=['day','pos'],right_index=True,how='outer')
输出:
day pos value
0 1 1 1.0
1 1 14 2.0
2 1 18 3.0
3 2 1 1.0
4 2 14 2.0
5 3 18 3.0
5 2 18 NaN
5 3 1 NaN
5 3 14 NaN
,
您可以reindex
:
s = pd.MultiIndex.from_product([df["day"].unique(),df["pos"].unique()],names=["day","pos"])
print (df.set_index(["day","pos"]).reindex(s).reset_index())
day pos value
0 1 1 1.0
1 1 14 2.0
2 1 18 3.0
3 2 1 1.0
4 2 14 2.0
5 2 18 NaN
6 3 1 NaN
7 3 14 NaN
8 3 18 3.0
,
我会避免手动product
使用所有可能的值。
相反,每天可以获得reindex
的唯一值:
u = df.pos.unique()
df.groupby('day').apply(lambda s: s.set_index('pos').reindex(u))['value']\
.reset_index()
day pos value
0 1 1 1.0
1 1 14 2.0
2 1 18 3.0
3 2 1 1.0
4 2 14 2.0
5 2 18 NaN
6 3 1 NaN
7 3 14 NaN
8 3 18 3.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。