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)