在工作中,有时候需要将同一个单元格里的数据进行拆分成多列数据,然后进行统计、分类等其他操作,这时候get_dummies()
方法就可以派上用场了。
pandas
和pandas.Series
都有各自的get_dummies()
方法,名字虽然相同,但是结果并不一样。Series
的get_dummies()
接受一个sep参数,默认是|,根据该分隔符将string进行切分,返回Dataframe。1
Series.str.get_dummies(sep='|')
在下面两个例子中,可以看到DataFrame也使用了Series
的get_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())
pandas
的get_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
4import 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
4import pandas as pd
df = pd.DataFrame({'id': [1,2], 'labels' : [{'a':11,'b':22}, {'c':33}]})
pd.DataFrame(df.pop('labels').values.tolist())