热线电话:13121318867

登录
2019-02-12 阅读量: 1140
如何根据另一列的值更新pandas数据框中的列

我有一个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

39.7527
2
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子