【问题标题】:How to count the number of unique elements from two lists如何计算两个列表中唯一元素的数量
【发布时间】:2021-10-13 11:16:05
【问题描述】:

我有一个包含数百列的 pandas 数据框,我需要知道两列中唯一元素的数量。 以下是数据示例:

df2 = pd.DataFrame(data={
'colA_1': ["12.456.", "......7", "..34..7"],
'colA_2': ["1......", "1.....7", "..34..7"],
'ID': ["idx1", "idx1", "idx2"]})

我做的是:

  1. 连接两列
  2. 计算唯一元素。

我是这样做的:

df['colA_1'] = df['colA_1'].apply(list)
df['colA_2'] = df['colA_2'].apply(list)
df['colA'] = df['colA_1'] + df['colA_2']
df['colA'] = df. colA.nunique()

但我收到此错误:

TypeError: unhashable type: 'list'

你知道如何解决这个问题吗?

【问题讨论】:

  • 能否提供数据示例?
  • @mozway 当然,抱歉遗漏
  • “12.456”对你来说是什么元素。还是“1”、“2”、“.”等?
  • @mozway "1"、"2" 等是一个元素,因为当我使用 apply(list) 时,"12.456." 变为 ['1', '2', '.', '4', '5', '6', '.']
  • 好的,那么我提供了一个解决方案。在这种情况下它给了我 8 个

标签: python pandas list dataframe


【解决方案1】:

你可以使用:

len(set(df2.filter(like='colA').sum().sum()))

输出:8

这会合并所有行的两列的所有字符串,并使用set计算唯一元素

原答案

为了计算唯一性,pandas/python 对对象进行哈希处理。它们需要是不可变的,这不是列表的情况,因此是错误的。如果您的列仅包含列表,您可以转换为字符串,然后计算唯一元素的数量:

df2.colA.astype(str).nunique()

这并不总是一个完美的解决方案,但在大多数情况下应该可以工作。

另一种选择是不转换为列表,但为了给您更好的建议,我们需要获取数据示例。

【讨论】:

  • 我刚刚做了,但是数据集的每一行都得到了1作为结果。我编辑了问题,以便您知道数据是什么样的
  • 我想知道先fillna是否更安全,以防万一有NaN。我认为在那种情况下求和会失败。
  • @merced 有很多方法可以让它掉下来,数字,对象等。问题的描述是DataFrame包含字符串。如果不是这种情况,那么这是一个不同的问题。 “过早优化万恶之源” D. Knuth ;)
猜你喜欢
  • 2019-09-05
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
  • 2013-11-30
  • 2020-06-27
相关资源
最近更新 更多