如果术语在单元格中,则熊猫会生成“真/假”列

时间:2019-05-03 10:32:49

标签: python python-3.x pandas dataframe

我有一列值以字符串形式列出,并以';分隔。 ',我想为每个单独的值生成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,它就会以蜗牛的速度前进。非常感谢您的帮助!

1 个答案:

答案 0 :(得分:8)

尝试使用Series.str.get_dummiesDataFrame.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