错误:无法散列的类型:“列表”。使用df.groupby.apply

时间:2018-09-07 15:07:39

标签: python pandas pandas-groupby

这是我的数据框:

enter image description here

我想按 airline 对数据框进行排序,然后在此组中按 tweet_created 进行排序。 airline tweet_created 是我数据框中的两列。我尝试了以下

df.groupby(['airline']).apply(lambda x: x.sort_values(['tweet_created'])).reset_index(drop = True)

但是出现此错误:

unhashable type: 'list'

我不明白这里出了什么问题。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

在示例数据框中,您的airline系列由list对象组成。由于list是可变的且不可散列,因此不能用于分组操作。在内部,GroupBy依赖于哈希。

假设airline系列中的每个列表仅包含一个元素,则可以在分组之前转换数据。一种方法是通过itertools.chain

from itertools import chain

df = pd.DataFrame({'airline': [['VirginAmerica'], ['united'], ['USAirways']]})

df['airline'] = list(chain.from_iterable(df['airline']))

print(df)

         airline
0  VirginAmerica
1         united
2      USAirways

一些替代方法的性能基准测试

# pandas v0.19.2, python 3.6.0

df = pd.concat([df]*1000, ignore_index=True)

%timeit list(chain.from_iterable(df['airline']))  # 228 µs per loop
%timeit np.concatenate(df['airline'])             # 84.9 ms per loop
%timeit df['airline'].apply(pd.Series)            # 817 ms per loop