Измените кадр данных Pandas с дублированием индекса и заполните недостающие строки

Я хотел бы добавить недостающие строки, соответствующие данному индексу.

Например, если у меня есть:

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 ответа


Используйте DataFrame.set_index с DataFrame.unstack , DataFrame.stack и DataFrame.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

Другой способ - Multiindex.from_product с reindex :

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

Есть идеи?

10000