python - 将 Pandas 中的某些列替换为 `filter(like = "")`

标签 python python-2.7 pandas filter dataframe

有时,我会操作数据帧的某些列并重新更改它。

例如,一个数据框 df 有 6 列,如下所示:

A, B1, B2, B3, C, D

我想将列 (B1,B2,B3) 中的值更改为 (B1*A, B2*A, B3*A)。
除了速度较慢的循环子例程外,df.filter(like = 'B') 会加速很多。

df.filter(like = "B").mul(df.A, axis = 0) 可以产生正确的答案。 但我无法使用以下方法更改 df 中类似 B 的列:
df.filter(like = "B") =df.filter(like = "B").mul(df.A. axis = 0)`

如何实现?我知道使用 pd.concat 创建一个新的数据框可以完成它。但当列数巨大时,这种方法可能会损失效率。我想要做的是将新值分配给已经存在的列。

如有任何建议,我们将不胜感激!

最佳答案

使用str.containsboolean indexing :

cols = df.columns[df.columns.str.contains('B')]
df[cols] = df[cols].mul(df.A, axis = 0)

示例:

import pandas as pd

df = pd.DataFrame({'A':[1,2,3],
                   'B1':[4,5,6],
                   'B2':[7,8,9],
                   'B3':[1,3,5],
                   'C':[5,3,6],
                   'D':[7,4,3]})

print (df)
   A  B1  B2  B3  C  D
0  1   4   7   1  5  7
1  2   5   8   3  3  4
2  3   6   9   5  6  3

cols = df.columns[df.columns.str.contains('B')]
print (cols)
Index(['B1', 'B2', 'B3'], dtype='object')

df[cols] = df[cols].mul(df.A, axis = 0)

print (df)
   A  B1  B2  B3  C  D
0  1   4   7   1  5  7
1  2  10  16   6  3  4
2  3  18  27  15  6  3

时间:

len(df)=3:

In [17]: %timeit (a(df))
1000 loops, best of 3: 1.36 ms per loop

In [18]: %timeit (b(df1))
100 loops, best of 3: 2.39 ms per loop

len(df)=30k:

In [14]: %timeit (a(df))
100 loops, best of 3: 2.89 ms per loop

In [15]: %timeit (b(df1))
100 loops, best of 3: 4.71 ms per loop

代码:

import pandas as pd

df = pd.DataFrame({'A':[1,2,3],
                   'B1':[4,5,6],
                   'B2':[7,8,9],
                   'B3':[1,3,5],
                   'C':[5,3,6],
                   'D':[7,4,3]})

print (df)
df = pd.concat([df]*10000).reset_index(drop=True)
df1 = df.copy()

def a(df):
    cols = df.columns[df.columns.str.contains('B')]
    df[cols] = df[cols].mul(df.A, axis = 0)
    return (df)


def b(df):
    df.loc[:, df.filter(regex=r'^B').columns] = df.loc[:, df.filter(regex=r'^B').columns].mul(df.A, axis=0)    
    return (df)

print (a(df))
print (b(df1))

关于python - 将 Pandas 中的某些列替换为 `filter(like = "")`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37610140/

相关文章:

python - 在 headless 健身房 jupyter Python 2.7 中获取 "AttributeError: ' ImageData' 对象没有属性 'data'"

Python 导入错误 : No module named datetime

python - 修改 Python Pandas 的输出描述

python - 使用rm命令删除文件

python - 撇号变成\x92

python - Pandas/SQLITE 数据框图

python - 用python数据框中的列表替换python中的缺失值

python - 谷歌应用程序引擎应用程序错误: 2 nonnumeric port: ''

Python 'str.contains' 函数未返回正确的值

python - 如何读取不受信任的证书以使用 Python 提取信息?