微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据列添加缺失的行

如何解决根据列添加缺失的行

我给出了以下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 举报,一经查实,本站将立刻删除。