我有一个pandas数据框,列= [A,B,C,D,... I,Z]。数据帧中有大约80000行,而列A,B,C,D,...,I对于所有这些行都具有值0。Z的值介于[0,9]之间。我要做的是更新数据帧中所有行的第x列的值,其中x是Z的当前值。如果x的值为0,则忽略。数据框看起来像 -
A B C D ... Z
0 0 0 0 0 ... 9
1 0 0 0 0 ... 1
2 0 0 0 0 ... 2
3 0 0 0 0 ... 3
这就是我到目前为止所拥有的。
cols = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
for index, row in df.iterrows():
if row['Z'] != 9:
df.loc[index, cols[int(row['Z'])]] = 1
这太慢了,导致脚本中途停止执行。有更快或更好的方法吗?我试着看np.where和np.apply,但我无法弄清楚语法。这是我尝试使用np.apply -
df.iloc[what goes here?] = df['Z'].apply(lambda x: 1 if x != 9)
上述样本的理想输出是 -
A B C D ... Z
0 0 0 0 0 ... 9
1 0 1 0 0 ... 1
2 0 0 1 0 ... 2
3 0 0 0 1 ... 3
解决办法:
Pandas有一个函数pd.get_dummies,它完全符合您的要求:
In [274]: pd.get_dummies(['A','C','B','D'])
Out[274]:
A B C D
0 1 0 0 0
1 0 0 1 0
2 0 1 0 0
3 0 0 0 1
通过创建colsNumPy数组,您可以使用NumPy整数数组索引来生成所需的列标签。(该'temp'栏的目的解释如下):
In [276]: cols[df['Z']]
Out[276]: array(['temp', 'B', 'C', 'D', 'B', 'F', 'E'], dtype='<U3')
这样就get_dummies生成了这个DataFrame:
In [277]: pd.get_dummies(cols[df['Z']])
Out[277]:
B C D E F temp
0 0 0 0 0 0 1
1 1 0 0 0 0 0
2 0 1 0 0 0 0
3 0 0 1 0 0 0
4 1 0 0 0 0 0
5 0 0 0 0 1 0
6 0 0 0 1 0 0








暂无数据