我有一个这样的数据框,
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方式来实现它。
答案 0 :(得分:1)
想法是过滤掉连续的B
或C
值,然后将所有其他B
或C
替换为丢失的值。然后向前填充缺失的值,但仅保留与回填相同的值,最后用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