有时,我会操作数据帧的某些列并重新更改它。
例如,一个数据框 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.contains
与 boolean 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/