【问题标题】:inplace apply to columns of pandas dataframe satisfying conditions就地适用于满足条件的熊猫数据框列
【发布时间】:2017-09-10 04:33:09
【问题描述】:

考虑以下 pandas 数据框:

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

我想对名称中包含字符“x”的列应用一个函数(比如乘以 2)

这可以通过以下方式完成:

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

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

【问题讨论】:

  • 我刚刚对你的问题投了赞成票……你现在有足够的代表来投票。随意对您接受的答案进行投票。

标签: pandas dataframe apply


【解决方案1】:

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

更新:

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

【讨论】:

  • 太棒了。作为原始问题的一个转折点,我还需要重命名那些包含“x”的列,例如“x1”被重命名为“ytext_1_moretext”,“x2”被重命名为“ytext_2_moretext”。我知道如何使用正则表达式替换和 df.rename(columns=lambda col: re.sub(... 这是正确的方法,或者甚至可以将这种选择性列重命名轻松合并到您的代码中吗?跨度>
  • 请注意,根据 OP 的要求,这些建议都不是真正“就地”的。仍然需要分配 df = df.apply(...)
  • @MaxU 如何将您的方法应用到一定数量的行
  • @Naveen,请提出一个新问题,放一个小的可重现数据集和您想要的数据集...
  • 与@piRSquared 的回答不同,这并没有像 OP 所要求的那样为问题提供就地解决方案
【解决方案2】:

使用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

【讨论】:

    猜你喜欢
    • 2019-09-06
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多