Python 3.x 通过迭代大熊猫数据帧中的行来添加伪列
我有一个熊猫数据帧(X11),如下所示: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
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作为其在特定行中出现的值