Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于另一列的值更新数据帧中列的更快方法_Python_Pandas_Numpy_Dataframe - Fatal编程技术网

Python 基于另一列的值更新数据帧中列的更快方法

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

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