使用另一列中的值列表在pandas dataframe中创建新列,而不使用“groupby”

时间:2016-04-06 20:51:34

标签: python pandas

我使用大型数据集,使pandas group和groupby函数花费很长时间/使用太多内存。我听说有人说groupby可能很慢,但我找不到更好的解决方案。

如果我的数据框有2列类似于:

df = pd.DataFrame({'a':[1,2,2,4], 'b':[1,1,1,1]})

a     b     
1     1     
2     1     
2     1      
4     1     

我希望返回与另一列中的值匹配的值列表:

a     b     list_of_b
1     1        [1]
2     1        [1,1]
2     1        [1,1]
4     1        [1]

我目前使用:

df_group = df.groupby('a')
df['list_of_b'] = df.apply(lambda row: df_group.get_group(row['a'])['b'].tolist(), axis=1)

上面的代码适用于小型内容,但不适用于大型数据帧(df> 1,000,000行)是否有人有更快的方法来执行此操作?

3 个答案:

答案 0 :(得分:0)

在4K行上我得到以下内容:

In [29]:
df_group = df.groupby('a')
​
%timeit df.apply(lambda row: df_group.get_group(row['a'])['b'].tolist(), axis=1)
%timeit df['a'].map(df.groupby('a')['b'].apply(list))

1 loops, best of 3: 4.37 s per loop
100 loops, best of 3: 4.21 ms per loop

答案 1 :(得分:0)

只是进行分组然后再加入原始数据框似乎要快得多:

def make_lists(df):
    g = df.groupby('a')
    def list_of_b(x):
        return x.b.tolist()
    return df.set_index('a').join(
        pd.DataFrame(g.apply(list_of_b),
                     columns=['list_of_b']),
        rsuffix='_').reset_index()

这为我提供 192ms 每个循环,其中 1M 行生成如下:

df1 = pd.DataFrame({'a':[1,2,2,4], 'b':[1,1,1,1]})
low = 1
high = 10 
size = 1000000
df2 = pd.DataFrame({'a':np.random.randint(low,high,size),
                    'b':np.random.randint(low,high,size)})

make_lists(df1)
Out[155]:
    a   b   list_of_b
0   1   1   [1]
1   2   1   [1, 1]
2   2   1   [1, 1]
3   4   1   [1]
In [156]:


%%timeit
make_lists(df2)
10 loops, best of 3: 192 ms per loop

答案 2 :(得分:0)

我能想到的最短的解决方案:

Navigate