Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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 3.x 通过迭代大熊猫数据帧中的行来添加伪列_Python 3.x_Numpy_Pandas_Dataframe - Fatal编程技术网

Python 3.x 通过迭代大熊猫数据帧中的行来添加伪列

Python 3.x 通过迭代大熊猫数据帧中的行来添加伪列,python-3.x,numpy,pandas,dataframe,Python 3.x,Numpy,Pandas,Dataframe,我有一个熊猫数据帧(X11),如下所示: dx1 dx2 dx3 dx4 0 25041 40391 5856 0 1 25041 40391 25081 5856 2 25041 40391 42822 0 3 25061 40391 0 0 4 25041 40391 0 5856 5 40391 25002

我有一个熊猫数据帧(X11),如下所示:

    dx1      dx2    dx3    dx4    
0   25041   40391   5856    0     
1   25041   40391   25081   5856  
2   25041   40391   42822   0     
3   25061   40391   0       0     
4   25041   40391   0       5856  
5   40391   25002   5856    3569 
dx1    25041  25061  40391
0      1      0      0
1      1      0      0
2      1      0      0
3      0      1      0
4      1      0      0
5      0      0      1
['25041' '25061' '40391']
dx2    25002  40391
0      0      1
1      0      1
2      0      1
3      0      1
4      0      1
5      1      0
['25002' '40391']
dx3    0  25081  42822  5856
0  0      0      0     1
1  0      1      0     0
2  0      0      1     0
3  1      0      0     0
4  1      0      0     0
5  0      0      0     1
[0 '25081' '42822' '5856']
dx4    0  3569  5856
0  1     0     0
1  0     0     1
2  1     0     0
3  1     0     0
4  0     0     1
5  0     1     0
[0 '3569' '5856']
我想为单元格值(如25041403915856等)创建虚拟列。因此,如果25041出现在任何dxs列的特定行中,则将有一个值为1或0的列25041。我正在使用这段代码,它在行数较少时工作。最终结果在底部

mat = X11.as_matrix(columns=None)
values, counts = np.unique(mat.astype(str), return_counts=True)

for x in values:
    X11[x] = X11.isin([x]).any(1).astype(int)
当行数达到数千行或数百万行时,它会一直挂起并花费很长时间,我不会得到任何结果

然后我开始使用这个代码:@michaelg建议

colN_d = X11.columns.values

for column_name in colN_d:
    dummies = pd.get_dummies(X11[column_name])
    print(column_name, dummies)
    col_names_dummies = dummies.columns.values
    print(col_names_dummies)

    #then you can append new columns to the dataframe
    for i,value in enumerate(col_names_dummies):
        X11[value] = dummies.iloc[:,i]
这会生成虚拟列,但对于出现在多个列中的虚拟变量,如40391(出现在dx1和dx2中)、0、5856(出现在dx3和dx4中),它会生成多个虚拟列,并覆盖以前由相同名称生成的虚拟列,因此会释放行值。大概是这样的:

    dx1      dx2    dx3    dx4    
0   25041   40391   5856    0     
1   25041   40391   25081   5856  
2   25041   40391   42822   0     
3   25061   40391   0       0     
4   25041   40391   0       5856  
5   40391   25002   5856    3569 
dx1    25041  25061  40391
0      1      0      0
1      1      0      0
2      1      0      0
3      0      1      0
4      1      0      0
5      0      0      1
['25041' '25061' '40391']
dx2    25002  40391
0      0      1
1      0      1
2      0      1
3      0      1
4      0      1
5      1      0
['25002' '40391']
dx3    0  25081  42822  5856
0  0      0      0     1
1  0      1      0     0
2  0      0      1     0
3  1      0      0     0
4  1      0      0     0
5  0      0      0     1
[0 '25081' '42822' '5856']
dx4    0  3569  5856
0  1     0     0
1  0     0     1
2  1     0     0
3  1     0     0
4  0     0     1
5  0     1     0
[0 '3569' '5856']
最终的结果是:这是不正确的,不符合我的期望

dx1     dx2     dx3     dx4     25041   25061   40391   25002   0   25081   
25041   40391   5856    0       1       0       1       0       1   0   
25041   40391   25081   5856    1       0       1       0       0   1   
25041   40391   42822   0       1       0       1       0       1   0   
25061   40391   0       0       0       1       1       0       1   0   
25041   40391   0       5856    1       0       1       0       0   0   
40391   25002   5856    3569    0       0       0       1       0   0   
您可以看到40391出现在所有行中,因此所有行中都应该有1。但如上所述,该程序创建了两个同名的假人,最后一个假人包含在其中。然而,两种情况的结合应足以满足要求。列“0”的情况类似

它应该是这样的:这是正确的,输出应该是这样的

dx1     dx2     dx3    dx4  0   25002   25041   25061   25081   3569    40391   42822   5856
25041   40391   5856    0   0   0       1       0       0       0          1        0       1
25041   40391   25081  5856 0   0       1       0       1       0            1      0       1
25041   40391   42822   0   0   0       1       0       0       0           1       1       0
25061   40391   0       0   0   0       0       1       0       0          1        0       0
25041   40391   0    5856   0   0       1       0       0       0          1        0       1
40391   25002 5856   3569   0   1       0       0       0       1          1        0       1
有没有办法根据我的需求高效地创建虚拟列?
您知道如何改进上述逻辑吗?

您提供的示例数据的预期输出是什么?预期输出将以25041403915856等作为列名,以1&0作为其在特定行中出现的值