熊猫分配列列表中的结果



假设我有一个如下所示的数据帧:

import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({'A':np.random.randn(5), 'B': np.zeros(5), 'C': np.zeros(5)})
df
>>>
A    B    C
0  0.496714  0.0  0.0
1 -0.138264  0.0  0.0
2  0.647689  0.0  0.0
3  1.523030  0.0  0.0
4 -0.234153  0.0  0.0

我有一个列列表,当A为负时,我想用值1填充这些列。

idx = df.A < 0
cols = ['B', 'C']

因此,在这种情况下,我希望索引[1,'B']和[4,'C']设置为1。

我尝试过的:

但是,执行df.loc[idx, cols] = 1会将整行设置为1,而不仅仅是单个列。我还试着做了df.loc[idx, cols] = pd.get_dummies(cols),结果是:

A    B    C
0  0.496714  0.0  0.0
1 -0.138264  0.0  1.0
2  0.647689  0.0  0.0
3  1.523030  0.0  0.0
4 -0.234153  NaN  NaN

我假设这是因为get_dummies的索引和数据帧不对齐。

预期输出:

A    B    C
0  0.496714  0.0  0.0
1 -0.138264  1.0  0.0
2  0.647689  0.0  0.0
3  1.523030  0.0  0.0
4 -0.234153  0.0  1.0

那么,做这件事最好(读得最快(的方法是什么呢。在我的例子中,有1000行和5列。

结果的时间安排:

TLDR:直接编辑值更快。

%%timeit
df.values[idx, df.columns.get_indexer(cols)] = 1

每个环路123µs±2.5µs(7次运行的平均值±标准偏差,每个环路10000个(

%%timeit
df.iloc[idx.array,df.columns.get_indexer(cols)]=1

每个环路266µs±7µs(7次运行的平均值±标准偏差,每个环路1000个(

使用numpy索引来提高性能:

idx = df.A < 0
res = ['B', 'C']
arr = df.values
arr[idx, df.columns.get_indexer(res)] = 1
print (arr)
[[ 0.49671415  0.          0.        ]
[-0.1382643   1.          0.        ]
[ 0.64768854  0.          0.        ]
[ 1.52302986  0.          0.        ]
[-0.23415337  0.          1.        ]]

df = pd.DataFrame(arr, columns=df.columns, index=df.index)
print (df)
A    B    C
0  0.496714  0.0  0.0
1 -0.138264  1.0  0.0
2  0.647689  0.0  0.0
3  1.523030  0.0  0.0
4 -0.234153  0.0  1.0

备选方案:

idx = df.A < 0
res = ['B', 'C']
df.values[idx, df.columns.get_indexer(res)] = 1
print (df)
A    B    C
0  0.496714  0.0  0.0
1 -0.138264  1.0  0.0
2  0.647689  0.0  0.0
3  1.523030  0.0  0.0
4 -0.234153  0.0  1.0
ind = df.index[idx]
for idx,col in zip(ind,res):
...:     df.at[idx,col] = 1
In [7]: df
Out[7]:
A    B    C
0  0.496714  0.0  0.0
1 -0.138264  1.0  0.0
2  0.647689  0.0  0.0
3  1.523030  0.0  0.0
4 -0.234153  0.0  1.0

最新更新