从具有多个字符串的列生成get_dummies类型数据框的最快方法

时间:2015-01-24 02:25:53

标签: python pandas split dataframe

我有一个列'col2',它有一个字符串列表。我当前的代码太慢了,大约有2000个独特的字符串(下面例子中的字母)和4000行。结束为2000列和4000行。

In [268]: df.head()
Out[268]:
    col1    col2
0   6       A,B
1   15      C,G,A
2   25      B

有没有一种快速的方法来制作这种傻瓜格式?每个字符串都有自己的列,并且在每个字符串的列中,如果该行在col2中具有该字符串,则为0或1。

In [268]: def get_list(df):
d = []
for row in df.col2:
    row_list = row.split(',')
    for string in row_list:
        if string not in d:
            d.append(string)
return d

df_list = get_list(df)

def make_cols(df, lst):
    for string in lst:
        df[string] = 0
    return df

df = make_cols(df, df_list)


for idx in range(0, len(df['col2'])):
    row_list = df['col2'].iloc[idx].split(',')
    for string in row_list:
        df[string].iloc[idx]+= 1

Out[113]:
col1    col2    A   B   C   G
0   6   A,B     1   1   0   0
1   15  C,G,A   1   0   1   1
2   25  B       0   1   0   0

这是我目前的代码,但它太慢了。

谢谢你的帮助!

1 个答案:

答案 0 :(得分:16)

您可以使用:

>>> df['col2'].str.get_dummies(sep=',')
   A  B  C  G
0  1  1  0  0
1  1  0  1  1
2  0  1  0  0

加入数据框:

>>> pd.concat([df, df['col2'].str.get_dummies(sep=',')], axis=1)
   col1   col2  A  B  C  G
0     6    A,B  1  1  0  0
1    15  C,G,A  1  0  1  1
2    25      B  0  1  0  0