根据列添加缺失的行

我已经给出了以下 df


df = pd.DataFrame(data = {'day': [1, 1, 1, 2, 2, 3], 'pos': 2*[1, 14, 18], 'value': 2*[1, 2, 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,14,18])).reset_index()

产量:


ValueError: cannot reindex from a duplicate axis


白板的微信
浏览 121回答 4
4回答

胡子哥哥

pivot那么我们来尝试一下stack:df.pivot('day','pos','value').stack(dropna=False).reset_index(name='value')输出:   day  pos  value0    1    1    1.01    1   14    2.02    1   18    3.03    2    1    1.04    2   14    2.05    2   18    NaN6    3    1    NaN7    3   14    NaN8    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  value0    1    1    1.01    1   14    2.02    1   18    3.03    2    1    1.04    2   14    2.05    3   18    3.05    2   18    NaN5    3    1    NaN5    3   14    NaN

牛魔王的故事

product我会避免使用所有可能值的手册。reindex相反,人们可以获得每天的唯一值:u = df.pos.unique()df.groupby('day').apply(lambda s: s.set_index('pos').reindex(u))['value']\  .reset_index()   day  pos  value0    1    1    1.01    1   14    2.02    1   18    3.03    2    1    1.04    2   14    2.05    2   18    NaN6    3    1    NaN7    3   14    NaN8    3   18    3.0

潇湘沐

您可以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  value0    1    1    1.01    1   14    2.02    1   18    3.03    2    1    1.04    2   14    2.05    2   18    NaN6    3    1    NaN7    3   14    NaN8    3   18    3.0

江户川乱折腾

您可以使用pyjanitor的完整函数来公开缺失的值:您可以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  value0    1    1    1.01    1   14    2.02    1   18    3.03    2    1    1.04    2   14    2.05    2   18    NaN6    3    1    NaN7    3   14    NaN8    3   18    3.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python