[英]how to fill missing values with non missing values of same column for identical values of two other columns in 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 方式来做到这一点。
想法是过滤掉连续的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
当累积和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.