Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 从列列表中指定结果_Pandas_Dataframe - Fatal编程技术网

Pandas 从列列表中指定结果

Pandas 从列列表中指定结果,pandas,dataframe,Pandas,Dataframe,假设我有一个数据帧,如下所示: 将熊猫作为pd导入 将numpy作为np导入 np.随机种子(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 当

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

将熊猫作为pd导入
将numpy作为np导入
np.随机种子(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\u 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\u dummies
的索引和数据帧没有对齐

预期产出:
abc
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\u 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.        ]]
备选方案:

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
idx=df.A<0
res=['B','C']
df.values[idx,df.columns.get_indexer(res)]=1
打印(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

尽可能避免python中的for循环我想这是一个答案,但希望找到更有效的方法+1尽管如此。我觉得应该有一种方法来组合,
df.columns.get_indexer
loc
,来重新创建整个数据帧选项。无论如何,感谢您提供的解决方案,我们将在接受之前等待一段时间。
df.iloc[idx.array,df.columns.get\u indexer(cols)]=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