2017-04-13 79 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