繁体   English   中英

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

[英]Fill the values between two pandas column values with same values

我有一个这样的数据框,

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 循环来做到这一点,但执行时间会很长,我正在寻找一些 pandas 快捷方式/pythonic 方式来做到这一点。

想法是过滤掉连续的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

当累积和Series.cumsum为奇数+ Series.mask 时,您只需要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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM