我有一列值以字符串形式列出,并以';分隔。 ',我想为每个单独的值生成true / false列。该数据帧很大(100k行,13个值),我当前的代码在该数据帧中每秒大约执行1.5行。有专门的熊猫功能可以更快地做到这一点吗?还是我犯了一个明显的错误,使我的代码变慢了?
数据如下:
id likes colour
0 1 blue
1 2 blue; green; red
2 3 red; purple
3 4 purple; blue
4 5 yellow; red
5 6 yellow
输出为:
id likes colour red yellow blue purple green
0 1 blue False False True False False
1 2 blue; green; red True False True False True
2 3 red; purple True False False True False
3 4 purple; blue False False True True False
4 5 yellow; red True True False False False
5 6 yellow False True False False False
当前功能从第一帧到第二帧:
def do_thing(data, col_name = 'likes colour'):
cols = list(set([j for i in list(data[col_name]) for j in i.split('; ')]))
for i in cols:
data[i] = None
for i in data.index:
for j in cols:
if j in data.loc[i, col_name]:
data.loc[i, j] = True
else:
data.loc[i, j] = False
return data
基本上,这首先识别每个不同的值,然后为每个值创建空列,最后在其中存在给定单词或不存在给定单词的情况下,将它们填充为True或False。
对于示例数据帧来说很好,但是一旦我添加了几种颜色并乘以10000,它就会以蜗牛的速度前进。非常感谢您的帮助!
答案 0 :(得分:8)
尝试使用Series.str.get_dummies
和DataFrame.join
:
# Setup
df = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6}, 'likes colour': {0: 'blue', 1: 'blue; green; red', 2: 'red; purple', 3: 'purple; blue', 4: 'yellow; red', 5: 'yellow'}})
df.join(df['likes colour'].str.get_dummies(sep='; ').astype(bool))
[出]
id likes colour blue green purple red yellow
0 1 blue True False False False False
1 2 blue; green; red True True False True False
2 3 red; purple False False True True False
3 4 purple; blue True False True False False
4 5 yellow; red False False False True True
5 6 yellow False False False False True