使用重复索引重塑 Pandas 数据框,并填充缺失的行

4
我希望能够根据给定的索引添加缺失的行。
例如,如果有以下数据:
df = pd.DataFrame({"date": ["1", "2", "1", "3"],
                   "name": ["bob", "bob", "anne", "anne"],
                   "x": [1, 2, 2, 3],
                   "y": [2, 4, 5, 5]})

我希望获得以下内容:
    name    date    x   y
    anne    1       2   5
    anne    2       NA  NA   <- because date 2 is missing for Anne
    anne    3       3   5
    bob     1       1   2
    bob     2       2   4
    bob     3       NA  NA   <- because date 3 is missing for Bob

我已经尝试使用pivot_table和pivot等方法,但目前为止无法弄清楚。

df.pivot_table(index = ["name", "date"], values = ['x','y'], fill_value=0).reset_index()

未填充缺失行。

2个回答

5
使用 DataFrame.set_index,结合 DataFrame.unstackDataFrame.stackDataFrame.reset_index,可以实现对数据帧的索引设置和重置。
df = df.set_index(["name", "date"]).unstack().stack(dropna=False).reset_index()
print (df)
   name date    x    y
0  anne    1  2.0  5.0
1  anne    2  NaN  NaN
2  anne    3  3.0  5.0
3   bob    1  1.0  2.0
4   bob    2  2.0  4.0
5   bob    3  NaN  NaN

你的解决方案可以采用相同的方法实现:
df = df.pivot_table(index = ["name", "date"], values = ['x','y'], fill_value=0).unstack().stack(dropna=False).reset_index()
print (df)
   name date    x    y
0  anne    1  2.0  5.0
1  anne    2  NaN  NaN
2  anne    3  3.0  5.0
3   bob    1  1.0  2.0
4   bob    2  2.0  4.0
5   bob    3  NaN  NaN

4
另一种方法是使用MultiIndex.from_productreindex函数:
idx = pd.MultiIndex.from_product((df['date'].unique(),
                                 df['name'].unique()),names=['date','name'])
df.set_index(['date','name']).reindex(idx).sort_index(level=1).reset_index()

  date  name    x    y
0    1  anne  2.0  5.0
1    2  anne  NaN  NaN
2    3  anne  3.0  5.0
3    1   bob  1.0  2.0
4    2   bob  2.0  4.0
5    3   bob  NaN  NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接