将缺失的值添加到熊猫组

时间:2020-04-17 15:41:13

标签: python pandas dataframe

比方说,我有一个类似的DataFrame:

import pandas as pd

df = pd.DataFrame({"Quarter": [1,2,3,4,1,2,3,4,4], 
                   "Type": ["a","a","a","a","b","b","c","c","d"], 
                   "Value": [4,1,3,4,7,2,9,4,1]})

   Quarter Type  Value
0        1    a      4
1        2    a      1
2        3    a      3
3        4    a      4
4        1    b      7
5        2    b      2
6        3    c      9
7        4    c      4
8        4    d      1

对于每个Type,总共需要有4行,这些行代表Quarter列所指示的四分之一。因此,它看起来像:

    Quarter Type  Value
0         1    a      4
1         2    a      1
2         3    a      3
3         4    a      4
4         1    b      7
5         2    b      2
6         3    b    NaN
7         4    b    NaN
8         1    c    NaN
9         2    c    NaN
10        3    c      9
11        4    c      4
12        1    d    NaN
13        2    d    NaN
14        3    d    NaN
15        4    d      1

然后,在Value列中缺少值的地方,使用具有相同Type的下一个最接近的可用值来填充丢失的值(如果它是缺少的最后一个四分之一,则用第三季度):

    Quarter Type  Value
0         1    a      4
1         2    a      1
2         3    a      3
3         4    a      4
4         1    b      7
5         2    b      2
6         3    b      2
7         4    b      2
8         1    c      9
9         2    c      9
10        3    c      9
11        4    c      4
12        1    d      1
13        2    d      1
14        3    d      1
15        4    d      1

完成此任务的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

使用reindex

idx = pd.MultiIndex.from_product([
    df['Type'].unique(),
    range(1,5)
], names=['Type', 'Quarter'])

df.set_index(['Type', 'Quarter']).reindex(idx) \
    .groupby('Type') \
    .transform(lambda v: v.ffill().bfill()) \
    .reset_index()

答案 1 :(得分:3)

您可以使用set_indexunstack创建所需的缺失行(假设每个季度至少有一种类型可用),然后在ffillbfill列,最后stackreset_index返回原始形状

df = df.set_index(['Type', 'Quarter']).unstack()\
       .ffill(axis=1).bfill(axis=1)\
       .stack().reset_index()

print (df)
   Type  Quarter  Value
0     a        1    4.0
1     a        2    1.0
2     a        3    3.0
3     a        4    4.0
4     b        1    7.0
5     b        2    2.0
6     b        3    2.0
7     b        4    2.0
8     c        1    9.0
9     c        2    9.0
10    c        3    9.0
11    c        4    4.0
12    d        1    1.0
13    d        2    1.0
14    d        3    1.0
15    d        4    1.0