Python 基于另一列的值更新数据帧中列的更快方法
我有一个pandas数据框,列=[a,B,C,D,…I,Z]。数据帧中大约有80000行,列A、B、C、D,…,所有这些行的值都是0。Z的值介于[0,9]之间。我试图做的是更新数据框中所有行的第x列的值,其中x是Z的当前值。如果x的值为0,则忽略。数据框看起来像-Python 基于另一列的值更新数据帧中列的更快方法,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有一个pandas数据框,列=[a,B,C,D,…I,Z]。数据帧中大约有80000行,列A、B、C、D,…,所有这些行的值都是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
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
屈服
A B C D E F G H I Z
0 0 0 0 0 0 0 0 0 0 9
1 0 1 0 0 0 0 0 0 0 1
2 0 0 1 0 0 0 0 0 0 2
3 0 0 0 1 0 0 0 0 0 3
4 0 1 0 0 0 0 0 0 0 1
5 0 0 0 0 0 1 0 0 0 5
6 0 0 0 0 1 0 0 0 0 4
B C D E F Z
0 0 0 0 0 0 9
1 1 0 0 0 0 1
2 0 1 0 0 0 2
3 0 0 1 0 0 3
4 1 0 0 0 0 1
5 0 0 0 0 1 5
6 0 0 0 1 0 4
Pandas有一个功能,它可以实现您想要的功能:
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
通过使cols
成为一个NumPy数组,您可以使用
所需的列标签。(下面解释了'temp'
列的用途):
df.update(other)
将非NaN值从other
数据帧复制到df
。由于df
没有标记为temp
的列,因此忽略该列中的值
或者,使用
pd.get_假人(cols[df['Z'])构造df['Z']
:
屈服
A B C D E F G H I Z
0 0 0 0 0 0 0 0 0 0 9
1 0 1 0 0 0 0 0 0 0 1
2 0 0 1 0 0 0 0 0 0 2
3 0 0 0 1 0 0 0 0 0 3
4 0 1 0 0 0 0 0 0 0 1
5 0 0 0 0 0 1 0 0 0 5
6 0 0 0 0 1 0 0 0 0 4
B C D E F Z
0 0 0 0 0 0 9
1 1 0 0 0 0 1
2 0 1 0 0 0 2
3 0 0 1 0 0 3
4 1 0 0 0 0 1
5 0 0 0 0 1 5
6 0 0 0 1 0 4
请注意,如果与之对应的Z
列中没有值,则某些列可能会丢失。能否为您的小样本发布所需的输出?我们如何更新第x列,例如x是8,只有5列?@user3483203我已经更正了问题描述,并用所需的输出更新了它。非常感谢!这正是我需要的,而且速度惊人。
import numpy as np
import pandas as pd
cols = np.array(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'temp'])
df = pd.DataFrame({'Z':[9,1,2,3,1,5,4]})
df = pd.concat([pd.get_dummies(cols[df['Z']]), df['Z']], axis=1)
df = df.drop('temp', axis=1)
print(df)
B C D E F Z
0 0 0 0 0 0 9
1 1 0 0 0 0 1
2 0 1 0 0 0 2
3 0 0 1 0 0 3
4 1 0 0 0 0 1
5 0 0 0 0 1 5
6 0 0 0 1 0 4