Pandas DataFrame 基于第一行值的条件前向填充
Pandas DataFrame conditional forward filling based on first row values
我有以下数据框:
import pandas as pd
df = pd.DataFrame({
'col1':['A',pd.NA,pd.NA,pd.NA,pd.NA, 'B', pd.NA, pd.NA],
'col2':[9.5, 6,24,8, 30, 7, 6, 8],
})
print(df)
给予:
col1 col2
0 A 9.5
1 <NA> 6.0
2 <NA> 24.0
3 <NA> 8.0
4 <NA> 30.0
5 B 7.0
6 <NA> 6.0
7 <NA> 8.0
我想要实现的是前向填充 col1,但不是在 col2 中的值大于我正向填充的行的 col2 值的行中。像这样:
col1 col2
0 A 9.5
1 A 6.0
2 <NA> 24.0
3 A 8.0
4 <NA> 30.0
5 B 7.0
6 B 6.0
7 <NA> 8.0
此处,索引 1 和 3 是向前填充的,但索引 2 和 4 不是,因为 col2 值 (24, 30) 大于初始行的 col2 值 (9.5)
我可以通过遍历 df 来达到预期的结果,如下所示:
val2 = -1
for i, r in df.iterrows():
if not pd.isnull(r['col1']):
val1 = r['col1']
val2 = r['col2']
else:
if r['col2']<val2:
df.loc[i, 'col1'] = val1
print(df)
有没有不使用 iterrows() 就可以实现的方法?
您可以将缺失值转发给助手系列 s
,然后按该系列比较组 - 所有值的第一个值,如果值不大于 numpy.where
:
s = df['col1'].ffill()
df['col1'] = np.where(df.groupby(s)['col2'].transform('first').gt(df['col2']),s,df['col1'])
print (df)
col1 col2
0 A 9.5
1 A 6.0
2 <NA> 24.0
3 A 8.0
4 <NA> 30.0
5 B 7.0
6 B 6.0
7 <NA> 8.0
我有以下数据框:
import pandas as pd
df = pd.DataFrame({
'col1':['A',pd.NA,pd.NA,pd.NA,pd.NA, 'B', pd.NA, pd.NA],
'col2':[9.5, 6,24,8, 30, 7, 6, 8],
})
print(df)
给予:
col1 col2
0 A 9.5
1 <NA> 6.0
2 <NA> 24.0
3 <NA> 8.0
4 <NA> 30.0
5 B 7.0
6 <NA> 6.0
7 <NA> 8.0
我想要实现的是前向填充 col1,但不是在 col2 中的值大于我正向填充的行的 col2 值的行中。像这样:
col1 col2
0 A 9.5
1 A 6.0
2 <NA> 24.0
3 A 8.0
4 <NA> 30.0
5 B 7.0
6 B 6.0
7 <NA> 8.0
此处,索引 1 和 3 是向前填充的,但索引 2 和 4 不是,因为 col2 值 (24, 30) 大于初始行的 col2 值 (9.5)
我可以通过遍历 df 来达到预期的结果,如下所示:
val2 = -1
for i, r in df.iterrows():
if not pd.isnull(r['col1']):
val1 = r['col1']
val2 = r['col2']
else:
if r['col2']<val2:
df.loc[i, 'col1'] = val1
print(df)
有没有不使用 iterrows() 就可以实现的方法?
您可以将缺失值转发给助手系列 s
,然后按该系列比较组 - 所有值的第一个值,如果值不大于 numpy.where
:
s = df['col1'].ffill()
df['col1'] = np.where(df.groupby(s)['col2'].transform('first').gt(df['col2']),s,df['col1'])
print (df)
col1 col2
0 A 9.5
1 A 6.0
2 <NA> 24.0
3 A 8.0
4 <NA> 30.0
5 B 7.0
6 B 6.0
7 <NA> 8.0