用相同的值填充两个熊猫列值之间的值

时间:2019-11-16 07:49:08

标签: python pandas dataframe

我有一个这样的数据框,

df1
col1    col2
 1        A
 2        A
 3        A
 4        B
 5        A
 6        A
 7        B
 8        A
 9        A
10        A
11        C
12        C
13        A
14        A
15        C
16        A
17        C

在上述数据帧中,B和C的总数始终为偶数。现在,我要用B和C填充两个B和C之间的所有值。

所以最终的数据帧应该看起来像

df1
col1    col2
 1        A
 2        A
 3        A
 4        B
 5        B
 6        B
 7        B
 8        A
 9        A
10        A
11        C
12        C
13        A
14        A
15        C
16        C
17        C

我可以使用for循环来做到这一点,但是执行时间将非常长,我正在寻找一些熊猫捷径/ pythonic方式来实现它。

2 个答案:

答案 0 :(得分:1)

想法是过滤掉连续的BC值,然后将所有其他BC替换为丢失的值。然后向前填充缺失的值,但仅保留与回填相同的值,最后用Series.fillna将所有其他值替换为原始值:

for v in ['B','C']:
    m1 = df['col2'].eq(v)
    m2 = m1.ne(m1.shift()).cumsum().duplicated(keep=False)
    s = df['col2'].where(m1 & ~m2)
    ff = s.ffill()
    df['col2'] = ff.where(ff == s.bfill()).fillna(df['col2'])
print (df)
    col1 col2
0      1    A
1      2    A
2      3    A
3      4    B
4      5    B
5      6    B
6      7    B
7      8    A
8      9    A
9     10    A
10    11    C
11    12    C
12    13    A
13    14    A
14    15    C
15    16    C
16    17    C

答案 1 :(得分:1)

您只需要选择累积金额Series.cumsum 是奇数 + Series.mask

for l in ['B','C']:
    mask=(df.col2.eq(l).cumsum()%2)==1
    df['col2']=df['col2'].mask(mask,l)
print(df)

    col1 col2
0     1    A 
1     2    A 
2     3    A 
3     4    B 
4     5    B 
5     6    B 
6     7    B 
7     8    A 
8     9    A 
9    10    A 
10   11    C 
11   12    C 
12   13    A 
13   14    A 
14   15    C 
15   16    C 
16   17    C