pandas中将一列数据转为多列数据

在工作中,有时候需要将同一个单元格里的数据进行拆分成多列数据,然后进行统计、分类等其他操作,这时候get_dummies()方法就可以派上用场了。

pandaspandas.Series都有各自的get_dummies()方法,名字虽然相同,但是结果并不一样。
Seriesget_dummies()接受一个sep参数,默认是|,根据该分隔符将string进行切分,返回Dataframe。

1
Series.str.get_dummies(sep='|')

在下面两个例子中,可以看到DataFrame也使用了Seriesget_dummies(),但是只返回拆分之后的DataFrame,需要再使用concat方法将原始数据合并。

1
2
3
4
5
6
7
8
9
10
# Series中使用
from pandas import Series

Series(['a|b', 'a', 'a|c']).str.get_dummies()

# 在DataFrame中使用
import pandas as pd

df = pd.DataFrame({'id': [1,2,3], 'labels' : ["a,b,c", "c,a", "d,a,b",]})
df['labels'].str.get_dummies(sep=',')

如果使用str.split()方法,也能拆分,但是并不能自动分列。

1
df2=pd.DataFrame(df['labels'].str.split(',').tolist())

pandasget_dummies()方法:

1
pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)

  • 参数说明:

    data:原始数据
    prefix:拆分后新列列名的前缀
    prefix_sep:前缀和原始字段的连接符
    dummy_na:是否忽略NAN列
    columns:指定拆分的列名,list.不指定列时,默认是对所有可分的列都进行拆分。
    sparse:Series和全部列拆分时返回“稀疏”Dataframe
    drop_first:是否移除拆分后的第一列数据

该方法并不会将列数据string进行分割,而是将指定列的数据的所有可能取值都作为列。

例子如下:

1
2
3
4
import pandas as pd

df = pd.DataFrame({'id': [1,2,3], "sex": ['male', 'female', 'male']})
pd.get_dummies(df, columns=['sex'])

如果需要拆分的列数据是字典时,使用str.values。这里使用了pop方法,直接将这一列数据给删除了,也可以直接使用df[‘lables’]来处理之后再删掉多余列。最后一点,需要完整的数据可以使用concat之类的方法将其与原始df进行合并。

1
2
3
4
import pandas as pd

df = pd.DataFrame({'id': [1,2], 'labels' : [{'a':11,'b':22}, {'c':33}]})
pd.DataFrame(df.pop('labels').values.tolist())