Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 Pandas Dataframe:如何将一列拆分为多个热编码列_Python_Python 3.x_Pandas_Dataframe_One Hot Encoding - Fatal编程技术网

Python Pandas Dataframe:如何将一列拆分为多个热编码列

Python Pandas Dataframe:如何将一列拆分为多个热编码列,python,python-3.x,pandas,dataframe,one-hot-encoding,Python,Python 3.x,Pandas,Dataframe,One Hot Encoding,我有这样一个文本文件: 444537110 3 11112111022002200022022111121222002... id chip g1_0 g1_1 g1_2 g2_0 g2_1 g2_2 g3_0 g3_1 g3_2 g4_0 ... 444537110 3 0 1 0 0 1 0 0 1 0 0 输入文件中的最后一个字段的长度为50k个字

我有这样一个文本文件:

444537110                         3 11112111022002200022022111121222002...
id          chip   g1_0 g1_1 g1_2 g2_0 g2_1 g2_2 g3_0 g3_1 g3_2 g4_0 ... 
444537110   3      0    1    0    0    1    0    0    1    0    0
输入文件中的最后一个字段的长度为50k个字符,并且只有0、1或2个字符。我想要最后一个字段的一个热编码版本。因此,我的预期结果是这样的数据帧:

444537110                         3 11112111022002200022022111121222002...
id          chip   g1_0 g1_1 g1_2 g2_0 g2_1 g2_2 g3_0 g3_1 g3_2 g4_0 ... 
444537110   3      0    1    0    0    1    0    0    1    0    0
我通过读取输入文件创建了一个初始数据帧:

df = pd.read_csv('test.txt', index_col=0, sep='\s+', header=None, names = ['chip', 'genos'])
这将创建一个包含3列的数据框,如下所示:

id        chip  genos
444537110    3  1111211102200220000022022111121222000200022002...
我想我可能可以使用下面的方法创建初始的单独列,然后使用pandas get_dummies函数进行一次热编码,但我无法创建单独的列。我试过了

[c for c in df['genos'].str]
但这并不是将角色分开

我在这里看到了一个类似的问题和答案:


但这只处理一个热编码,不处理拆分一个非常大的列所增加的复杂性

首先使用convert string to list和call创建
数据帧

如果需要将新列添加到原始列(如果可能缺少某些组合),则由具有
\uuu
的拆分列和由以下人员创建的所有组合使用:


考虑到@Dan对您的问题的评论,即您将以50k*3列结束,您可以通过这样做获得所需的输出:

string ="444537110 3 11112111022002200022022111121222002"
df = pd.DataFrame([string.split(" ")],columns=['id','chip','genos'])
max_number_of_genes = int(df.genos.apply(lambda x : len([y for y in x])).max())

#Create columns 
for gene in range(1,max_number_of_genes+1):
    for y in range(4):
        df['g{}_{}'.format(gene, y)] = 0

#Iterating over genos values 
for row_number, row in df.iterrows():
    genos = [int(x) for x in df.iloc[row_number, 2]]
    for gene_number, gene in enumerate(genos):     
        df.loc[row_number, 'g{}_{}'.format(gene_number+1, gene)] = 1 

print(df)
输出

+----+------------+-------+--------------------------------------+-------+-------+-------+-------+-------+-------+-------+------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-------+
|    |    id      | chip  |                genos                 | g1_0  | g1_1  | g1_2  | g1_3  | g2_0  | g2_1  | g2_2  | ...  | g33_2  | g33_3  | g34_0  | g34_1  | g34_2  | g34_3  | g35_0  | g35_1  | g35_2  | g35_3 |
+----+------------+-------+--------------------------------------+-------+-------+-------+-------+-------+-------+-------+------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-------+
| 0  | 444537110  |    3  | 11112111022002200022022111121222002  |    0  |    1  |    0  |    0  |    0  |    1  |    0  | ...  |     0  |     0  |     1  |     0  |     0  |     0  |     0  |     0  |     1  |     0 |
+----+------------+-------+--------------------------------------+-------+-------+-------+-------+-------+-------+-------+------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-------+

如果只拆分50k个字符,可以使用原始Python(为了可读性):


猜测您可能需要
df['genos'].str.get_dummies()
,对提供的数据不确定,尽管尝试了该建议,但没有效果。它返回了一个数据帧,其中一列以genos作为列标题,只有一列value@daragh你能假设你的最后一列只有3个字符长而不是50k,然后发布一些多行样本输入和完整的期望OHE输出吗?这将使你的意图更加清晰。因为从目前的情况看,你似乎想要一个包含3到50k不同值的幂的字段,这似乎是个坏主意(即,太多的列不太有用)@Dan我正在将结果数据帧反馈给神经网络,所以我希望有150k列。你确定这会给出正确的输出吗?genos的第一个基因应该编码为
g1_X
(X取决于它的值)@SebastienD-对不起,现在是晚餐时间,所以现在答案被编辑了。
>>> a,b,c = zip(*[{0:(1,0,0),1:(0,1,0),2:(0,0,1)}[int(c)] for c in df['genos'][0]])
>>> a,b,c
((0, 0, 0, 0, 0, 0, ...), (1, 1, 1, 1, 0, 1, ...), (0, 0, 0, 0, 1, 0, ...))