Python 基于外部数组值更改数据帧行

Python 基于外部数组值更改数据帧行,python,pandas,Python,Pandas,我有这个数据框df A B C D 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 这一系列事件 事件=[A C无B] 对于发生相应事件的每一列,我想在数据框中加1,如果没有,则不加任何内容。所以我的结果数据框是 A B C D 1 0 0 0 0 0 1 0 0 0 0

我有这个数据框
df

A  B  C   D
0  0  0   0        
0  0  0   0        
0  0  0   0        
0  0  0   0        
0  0  0   0        
这一系列事件

事件=[A C无B]

对于发生相应事件的每一列,我想在数据框中加1,如果没有,则不加任何内容。所以我的结果数据框是

A  B  C   D
1  0  0   0        
0  0  1   0        
0  0  0   0        
0  0  0   0        
0  1  0   0        
最明显的方式是循环

for i, event in enumerate(events):
    if event is not None:
        df[event][i] = 1
当行数很大时,有没有更有效的方法?

您可以在从事件创建的序列上使用,然后在df中使用列

events = ['A', 'C', None, None, 'B']
df_ = (pd.Series(events)
         .str.get_dummies()
         .reindex(columns=df.columns, fill_value=0)
      )
print (df_)
   A  B  C  D
0  1  0  0  0
1  0  0  1  0
2  0  0  0  0
3  0  0  0  0
4  0  1  0  0

reindex
实际上是在此处添加缺少的列D,在实际情况中,您可能不需要它

使用numpy广播将
df.columns
事件
进行比较并填充值

import numpy as np

df[:] = (df.columns.to_numpy() == np.array(events)[:,None]).astype(int)

Out[44]:
   A  B  C  D
0  1  0  0  0
1  0  0  1  0
2  0  0  0  0
3  0  0  0  0
4  0  1  0  0
如果你想说得更详细

df[:] = np.equal(df.columns, np.array(events)[:,None]).astype(int)