Inplace apply to pandas dataframe columns meeting conditions
Consider the following pandas dataframe:
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
I would like to apply a function (like multiply by 2) to those columns with names containing the 'x' character
It can be done:
df.filter(regex='x').apply(lambda c: 2*c)
but not in place. My decision:
tmp = df.filter(regex='x') tmp = tmp.apply(lambda c: 2*c) tmp['t'] = df['t'] df = tmp
which has the additional problem of reordering the columns. Is there a better way?
+3
source to share
2 answers
IIUC, you can do something like this:
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
+3
source to share
Use df.columns.str.contains('x')
to get a boolean slice maskdf
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
More generalized
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
Using 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
+1
source to share