如何通过pandas数据框中的某些条件更改子集上的多个列?
例如,给定输入数据:
import pandas as pd
dat = pd.DataFrame({"y": ("441912", "abc", "121", "4455")})
dat['leny'] = dat['y'].str.len()
dat['yfoo'] = None
dat
y leny yfoo
1: 441912 6 NA
2: abc 3 NA
3: 121 3 NA
4: 4455 4 NA
然后将y
以44开头并且长度为4或5的行进行子集化,然后对于那些行从y
开始剥离44,从{{1}减去2并将leny
设置为False,得到以下输出:
yfoo
我尝试这样做:
y leny yfoo
1: 441912 6 NA
2: abc 3 NA
3: 121 3 NA
4: 55 2 FALSE
接下来我该怎么做?
答案 0 :(得分:1)
创建一个面具:
m = dat.leny.isin((4, 5)) & dat.y.str.startswith('44')
现在,使用loc
并执行您的操作。
dat.loc[m, 'y'] = dat.loc[m, 'y'].str[2:]
dat.loc[m, 'leny'] -= 2
dat.loc[m, 'yfoo'] = False
dat
y leny yfoo
0 441912 6 None
1 abc 3 None
2 121 3 None
3 55 2 False
答案 1 :(得分:1)
使用理解来收集数据。
y = dat.y.values.tolist()
dat2 = np.array([
[x[2:], len(x) - 2, False, i]
for i, x in enumerate(y)
if x.startswith('44') and (len(x) // 2 == 2)
], object)
dat.iloc[dat2[:, -1].astype(int), :] = dat2[:, :-1]
dat
y leny yfoo
0 441912 6 None
1 abc 3 None
2 121 3 None
3 55 2 False