【问题标题】:Finding the mode of a series consisting of list elements in Pandas在 Pandas 中查找由列表元素组成的系列的模式
【发布时间】:2018-09-20 14:44:22
【问题描述】:

我正在使用pd.Series,其中每个条目都是一个列表。我想找到系列的模式,也就是这个系列中最常见的列表。我尝试过同时使用pandas.Series.value_countspandas.Series.mode。但是,这两种方法都会引发以下异常:

TypeError: unhashable type: 'list'

以下是此类系列的一个简单示例:

pd.Series([[1,2,3], [4,5,6], [1,2,3]])

我正在寻找一个返回 [1,2,3] 的函数。

【问题讨论】:

  • 你的系列有多大?
  • 不是很大 - 几百个元素,列表也有几百个条目。如果这是您的想法,我没有比较速度的解决方案
  • 我强烈推荐你这样做。简洁!= 性能。
  • @COLDSPEED 完全同意。谢谢

标签: python list pandas dataframe series


【解决方案1】:

您需要转换为 tuple ,然后使用 mode

pd.Series([[1,2,3], [4,5,6], [1,2,3]]).apply(tuple).mode().apply(list)
Out[192]: 
0    [1, 2, 3]
dtype: object

略有改进:

list(pd.Series([[1,2,3], [4,5,6], [1,2,3]]).apply(tuple).mode().iloc[0])
Out[210]: [1, 2, 3]

既然两个apply很丑

s=pd.Series([[1,2,3], [4,5,6], [1,2,3]])
s[s.astype(str)==s.astype(str).mode()[0]].iloc[0]
Out[205]: [1, 2, 3]

【讨论】:

  • 美丽。只是为了完成,我会在最后添加.iloc[0]
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,两个申请很烦
  • 我觉得烦人的是不加解释地投反对票。 :(
  • @splinter 是的,这是真的 :-) 因为你需要这个列表,我会推荐我的第二种方法 :-) 应该比第一种更快 :-)
  • @Wen 我认为您的第二个解决方案实际上会慢得多。第二个apply 很好,因为你不可能有很多模式。
【解决方案2】:

列表不可散列,因此您需要将 Serieslists 转换为 Seriestuples。

一旦你这样做了,你可以使用Counter快速高效生成一个多组元组,然后使用Counter.most_common来提取最常见的元素(AKA,mode)。

s = pd.Series([[1,2,3], [4,5,6], [1,2,3]])

from collections import Counter  

c = Counter(tuple(l) for l in s)
list(c.most_common(1)[0][0])
[1, 2, 3]

【讨论】:

  • 我也不明白反对票。有用。为简洁起见,我只是采用 Wen 的解决方案
  • 不是我。对此解决方案 +1。
  • 谢谢大家。 @splinter 我并不关心接受,而是关心您从中学到有用的东西。只要你这样做,我就可以了
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2016-07-18
  • 2011-01-12
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
相关资源
最近更新 更多