基于链对 pandas 行进行循环计算
Implementing a loop calculation on pandas rows based on chain
我有以下代码块,
import pandas as pd
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
.sort_values(by = 'xx1')
.reset_index(drop = True))
dat
for i in range(1, dat.shape[0]) :
if (dat.loc[i, 'aa2'] == 'qq') :
dat.loc[i, 'xx3'] = dat.loc[i - 1, 'xx3']
dat
我想知道第二个代码块是否
for i in range(1, dat.shape[0]) :
if (dat.loc[i, 'aa2'] == 'qq') :
dat.loc[i, 'xx3'] = dat.loc[i - 1, 'xx3']
可以使用 chain
继续第一个块来实现。意思是,我希望有以下的东西,
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
.sort_values(by = 'xx1')
.reset_index(drop = True)
### implement the for loop here
)
任何指针都会很有帮助
您可以 assign
xx3
再次通过 mask
中的 qq
值和 forward-filling 它。由于循环从 index=1
开始,我们从 index=1
:
开始掩码
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
.sort_values(by = 'xx1')
.reset_index(drop = True)
.assign(xx3 = lambda df: df['xx3'].mask(df['aa2'].eq('qq') & (df.index!=0)).ffill().astype(df['xx3'].dtype))
)
输出:
xx1 aa2 xx3
0 1 qq 6
1 2 pp 5
2 3 qq 5
我有以下代码块,
import pandas as pd
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
.sort_values(by = 'xx1')
.reset_index(drop = True))
dat
for i in range(1, dat.shape[0]) :
if (dat.loc[i, 'aa2'] == 'qq') :
dat.loc[i, 'xx3'] = dat.loc[i - 1, 'xx3']
dat
我想知道第二个代码块是否
for i in range(1, dat.shape[0]) :
if (dat.loc[i, 'aa2'] == 'qq') :
dat.loc[i, 'xx3'] = dat.loc[i - 1, 'xx3']
可以使用 chain
继续第一个块来实现。意思是,我希望有以下的东西,
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
.sort_values(by = 'xx1')
.reset_index(drop = True)
### implement the for loop here
)
任何指针都会很有帮助
您可以 assign
xx3
再次通过 mask
中的 qq
值和 forward-filling 它。由于循环从 index=1
开始,我们从 index=1
:
dat = (pd.DataFrame({'xx1' : [3,2,1], 'aa2' : ['qq', 'pp', 'qq'], 'xx3' : [4,5,6]})
.sort_values(by = 'xx1')
.reset_index(drop = True)
.assign(xx3 = lambda df: df['xx3'].mask(df['aa2'].eq('qq') & (df.index!=0)).ffill().astype(df['xx3'].dtype))
)
输出:
xx1 aa2 xx3
0 1 qq 6
1 2 pp 5
2 3 qq 5