【问题标题】:How to group by 3 columns and given count in Python DataFrames如何在 Python DataFrames 中按 3 列分组并给出计数
【发布时间】:2019-12-04 22:55:17
【问题描述】:

我有 3 列,我想根据这 3 列中的常用值进行计数,例如

Dataframe is
Date     Name    SoldItem
15-Jul    Joe     TV
15-Jul    Joe     Fridge
15-Jul    Joe     Washing Machine
15-Jul    Joe     TV
15-Jul    Joe     Fridge
15-Jul    Mary    Chair
15-Jul    Mary    Fridge
16-Jul    Joe     Fridge
16-Jul    Joe     Fridge
16-Jul    Tim     Washing Machine
17-Jul    Joe     Washing Machine
17-Jul    Jimmy   Washing Machine
17-Jul    Joe     Washing Machine
17-Jul    Joe     Washing Machine

And final output should be

Date      Name   SoldItem       Count
15-Jul     Joe    TV              2
           Joe    Fridge          2
           Joe    Washing Machine 1
          Mary    Chair           1
          Mary    Fridge          1
16-Jul     Joe    Fridge          2
           Tim    Washing Machine 1
17-Jul     Joe    Washing Machine 3
         Jimmy    Washing Machine 1

我尝试了下面的代码,但它只适用于 2 列

df.groupby(["Date", "Name"]).size()  

provides like

Date      Name   
15-Jul     Joe    5
          Mary    2
16-Jul     Joe    2
           Tim    1
17-Jul     Joe    3
         Jimmy    1
When i use the below
df.groupby(["Date", "Name", "SoldItem"]).size()  

it throws the error

ValueError: Length of passed values is xx, index implies 0

这就是我加载数据帧的方式


   fields = ['Date', 'Name', 'SoldItem']
   df = pd.read_csv('data.csv', skipinitialspace=True, usecols=fields)
   df_grp = df.groupby(["Date", "Name"]).size()
print df_grp

如果您能建议我如何根据 3 个值进行分组并提供计数,我将不胜感激。非常感谢提前。我也是 Python 新手。

【问题讨论】:

  • 你的数据集中有缺失值吗?

标签: python dataframe group-by count


【解决方案1】:

我认为您的数据集中有一些缺少数据,这就是您收到该错误的原因。您可能想查看是否有任何缺失值,因为您的代码应该没问题。

问题在于数据集中的 NA(缺失值)条目。数据集中的每一行在该列中至少有一个 NA (这是我自己的观点)。当您将 .groupby 应用于 NA 条目时,它不知道如何对 NA 进行分组,因此它会删除它们,留下一个空结果(长度为 0)。

在这里查看参考资料:https://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html https://pandas.pydata.org/pandas-docs/stable/user_guide/missing_data.html

以下是我从这个 Github 链接复制的示例 https://github.com/pandas-dev/pandas/issues/23050

会产生相同错误的简单代码示例

>>> df = pd.DataFrame({'A': ['x', 'y'], 'B': [np.nan, np.nan]})
>>> df.groupby(['A', 'B']).size()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/root/.local/share/virtualenvs/app-4PlAip0Q/lib/python3.7/site-packages/pandas/core/groupby/groupby.py", line 1227, in size
    result = self.grouper.size()
  File "/root/.local/share/virtualenvs/app-4PlAip0Q/lib/python3.7/site-packages/pandas/core/groupby/ops.py", line 233, in size
    dtype='int64')
  File "/root/.local/share/virtualenvs/app-4PlAip0Q/lib/python3.7/site-packages/pandas/core/series.py", line 249, in __init__
    .format(val=len(data), ind=len(index)))
ValueError: Length of passed values is 2, index implies 0

【讨论】:

  • 如果您要复制某人的答案,至少要给他们点赞:answer。由于情况不同,您的答案不太合适。但你是对的,这可能是由于 NA 值。
  • 我已经在这里复制了所有的参考资料。如果我想偷一个答案,我不会在这里发布我拿那个的参考资料
  • 感谢这条评论为我指明了正确的方向。我用 N.A 替换了空值,我的代码工作了。谢谢大家
【解决方案2】:

@user3423407 我将您的数据保存为 csv 文件并进行如下处理。

import pandas as pd
fields = ['Date', 'Name', 'SoldItem']
df = pd.read_csv('PathToCSVFile.csv', skipinitialspace=True, usecols=fields)
df_grp = df.groupby(["Date", "Name", "SoldItem"]).size()
print(df_grp)

得到如下输出。我没有对您的代码进行任何更改。对于示例数据集,它可以工作。是不是它不适用于更大的数据集?

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 2011-03-13
    • 2022-12-09
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多