【问题标题】:Pandas Python - value_counts() or idxmax() returns different value each timePandas Python - value_counts() 或 idxmax() 每次返回不同的值
【发布时间】:2019-12-27 08:33:23
【问题描述】:

我有一个系列,其中包含一些随机产品的列表。如果我打印描述,这就是它的样子:

<bound method NDFrame.describe of 176                                     reversible jacket
231                       the north face resolve 2 jacket
234                             columbia pike lake jacket
279     girl's 7-16 knitworks skater belted dress faux...
303                                flocked quilted jacket
                              ...
7665    tommy hilfiger big boys wayne colorblocked bas...
7685    men's toronto raptors columbia red flash forwa...
7796    the north face uo exclusive topography fanorak...
7809    lauren ralph lauren solid ultraflex classic-fi...
7922    tommy hilfiger sport faux-sherpa colorblocked ...
Name: desc, Length: 146, dtype: object>
<class 'pandas.core.series.Series'>

在这之后我有这两个陈述

max_occurence_prod = prod.where(prod.str.len() > 1)
curr_product = max_occurence_prod.value_counts().idxmax()

但是,每次运行这段代码,curr_product 的值似乎都不一样。例如,我第一次运行这段代码时,curr_product 的值是“diamond quilted packable jacket”,第二次是“boys' logan jacket

据我了解,value_counts() 函数应该返回一个包含唯一值计数的系列。如果这个系列每次都返回完全相同,那么idxmax() 不应该也返回相同的对应值吗?我似乎无法弄清楚为什么它每次都会返回不同的值。

这里是整体代码

max_occurence_prod = prod.where(prod.str.len() > 1)
curr_product = max_occurence_prod.value_counts().idxmax()
#new value is printed each time
print(max_occurence_prod.value_counts().idxmax())

抱歉,如果有任何不清楚的地方,我对 Python 和 Pandas 还很陌生

【问题讨论】:

  • 请包含一个完整的可重现示例。还有,你为什么用prod.where(prod.str.len() &gt; 1)而不是prod[prod.str.len() &gt; 1]
  • 我需要一个系列而不是一个列表。我这样做的原因是因为我只需要那些字符串长度 > 1 的行。
  • prod[prod.str.len() &gt; 1] 正在做你想做的事。
  • prod[prod.str.len() &gt; 1] 将返回一个列表,而不是一个系列。我需要一个系列
  • 错了。 prod[prod.str.len() &gt; 1] 计算为一个系列。你试过了吗?

标签: python python-3.x pandas


【解决方案1】:

似乎有 previous issues 关于 pandas value_counts() 如何以不一致的方式处理绑定值。

至于idxmax() documentation 明确表示:

如果多个值等于最大值,则返回具有该值的第一行标签。

恐怕你提供的信息量不足以让我用你的数据生成一个完整的例子,但这里是一个尝试:

import pandas as pd
data = {'col_1':['a','a','b','b','c','c'],'col_2':['one','two','three','one','two','three']}
df = pd.DataFrame(data)
for i in range(3):
    print(df['col_1'].value_counts().idxmax())

在命令中运行一次:

c
c
c

第二次上任:

b
b
b

第三次:

a
a
a

结论是,由于value_counts() 而不是idxmax(),您每次都会得到不同的值。使其始终可复制的一些解决方案是也使用sort_index(),以便输出不依赖于随机值。例如:

for i in range(3):
    print(df['col_1'].value_counts().sort_index().idxmax())

总是返回:

a
a
a

【讨论】:

  • 你是对的!为了获得更一致的结果,我所要做的就是max_occurence_prod.value_counts().sort_index().idxmax() 谢谢!
  • 我的 pandas 版本是 0.25.3,这似乎至少从 0.23.4 版本开始就是一个问题
猜你喜欢
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
相关资源
最近更新 更多