子集和更改具有不同"功能的多个列"

时间:2017-11-14 01:17:10

标签: python pandas

如何通过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

接下来我该怎么做?

2 个答案:

答案 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