2017-04-13 67 views
3

考虑下面的熊猫数据框:就地适用于大熊猫的列数据帧满足条件

df = pd.DataFrame({'t': [1,2,3], 'x1': [4,5,6], 'x2': [7,8,9]}) 

>>> print(df) 
t x1 x2 
0 1 4 7 
1 2 5 8 
2 3 6 9 

我想申请一个函数(比如乘以2),以这些列包含字符“X”

df.filter(regex='x').apply(lambda c: 2*c) 

,但不到位:

这可以这样做。我的解决方案是:

tmp = df.filter(regex='x') 
tmp = tmp.apply(lambda c: 2*c) 
tmp['t'] = df['t'] 
df = tmp 

它增加了更改列的顺序问题。有没有更好的办法?

+0

我只是投了你的问题......你现在有足够的代表处投自己。随意投票您接受的答案。 – piRSquared

回答

3

IIUC你可以做这样的事情:

In [239]: df.apply(lambda x: x*2 if 'x' in x.name else x) 
Out[239]: 
    t x1 x2 
0 1 8 14 
1 2 10 16 
2 3 12 18 

UPDATE:

In [258]: df.apply(lambda x: x*2 if 'x' in x.name else x) \ 
      .rename(columns=lambda x: 'ytext_{}_moretext'.format(x[-1]) if 'x' in x else x) 
Out[258]: 
    t ytext_1_moretext ytext_2_moretext 
0 1     8    14 
1 2    10    16 
2 3    12    18 
+0

太好了。作为原始问题的一个扭曲,我还需要重命名包含'x'的列,以便例如将'x1'重命名为'ytext_1_moretext',将'x2'重命名为'ytext_2_moretext'。我知道如何使用正则表达式替换和df.rename(columns = lambda col:re.sub(...)这是否是正确的方式,或者甚至可以轻松地将这种选择性列重命名并入您的代码? – rhz

+0

@ rhz,请检查更新... – MaxU

+0

请注意,这些建议都不是OP所要求的“原地”,仍然需要赋值'df = df.apply(...)'。 – normanius

1

使用df.columns.str.contains('x')获得布尔面膜切片df

df.loc[:, df.columns.str.contains('x')] *= 2 
print(df) 

    t x1 x2 
0 1 8 14 
1 2 10 16 
2 3 12 18 

更广义

def f(x): 
    return 2 * x 

m = df.columns.str.contains('x') 
df.loc[:, m] = f(df.loc[:, m]) 
print(df) 

    t x1 x2 
0 1 8 14 
1 2 10 16 
2 3 12 18 

使用apply

m = df.columns.str.contains('x') 
df.loc[:, m] = df.loc[:, m].apply(f) 
print(df) 

    t x1 x2 
0 1 8 14 
1 2 10 16 
2 3 12 18