【问题标题】:Pandas groupby to to_csv熊猫 groupby 到 to_csv
【发布时间】:2018-05-16 01:45:03
【问题描述】:

想要将 Pandas groupby 数据框输出到 CSV。尝试了各种 StackOverflow 解决方案,但没有奏效。

Python 3.6.1,熊猫 0.20.1

groupby 结果如下:

id  month   year    count
week                
0   9066    82  32142   895
1   7679    84  30112   749
2   8368    126 42187   872
3   11038   102 34165   976
4   8815    117 34122   767
5   10979   163 50225   1252
6   8726    142 38159   996
7   5568    63  26143   582

想要一个看起来像这样的 csv

week  count
0   895
1   749
2   872
3   976
4   767
5   1252
6   996
7   582

当前代码:

week_grouped = df.groupby('week')
week_grouped.sum() #At this point you have the groupby result
week_grouped.to_csv('week_grouped.csv') #Can't do this - .to_csv is not a df function. 

阅读 SO 解决方案:

output groupby to csv file pandas

week_grouped.drop_duplicates().to_csv('week_grouped.csv')

结果: AttributeError:无法访问“DataFrameGroupBy”对象的可调用属性“drop_duplicates”,请尝试使用“apply”方法

Python pandas - writing groupby output to file

week_grouped.reset_index().to_csv('week_grouped.csv')

结果: AttributeError: "无法访问 'DataFrameGroupBy' 对象的可调用属性 'reset_index',请尝试使用 'apply' 方法"

【问题讨论】:

  • 如果您来到这里想知道如何将每个单独的 groupby 保存到自己的 CSV 文件中,请参阅this answer

标签: python pandas csv pandas-groupby


【解决方案1】:

尝试这样做:

week_grouped = df.groupby('week')
week_grouped.sum().reset_index().to_csv('week_grouped.csv')

这会将整个数据帧写入文件。如果你只想要这两列,那么,

week_grouped = df.groupby('week')
week_grouped.sum().reset_index()[['week', 'count']].to_csv('week_grouped.csv')

下面是对原代码的逐行解释:

# This creates a "groupby" object (not a dataframe object) 
# and you store it in the week_grouped variable.
week_grouped = df.groupby('week')

# This instructs pandas to sum up all the numeric type columns in each 
# group. This returns a dataframe where each row is the sum of the 
# group's numeric columns. You're not storing this dataframe in your 
# example.
week_grouped.sum() 

# Here you're calling the to_csv method on a groupby object... but
# that object type doesn't have that method. Dataframes have that method. 
# So we should store the previous line's result (a dataframe) into a variable 
# and then call its to_csv method.
week_grouped.to_csv('week_grouped.csv')

# Like this:
summed_weeks = week_grouped.sum()
summed_weeks.to_csv('...')

# Or with less typing simply
week_grouped.sum().to_csv('...')

【讨论】:

  • 谢谢! - 为什么当 sum() 是 to_csv 语句的一部分时它起作用,而当 sum() 在它自己的行上完成时它不起作用?
  • @kalmdown,如果这回答了你的问题,你能把它标记为这样吗?单击复选标记使其变为绿色。
  • @kalmdown,我的回复是否回答了您的问题?我的回答仍未被标记为已接受。
【解决方案2】:

尝试将您的第二行更改为 week_grouped = week_grouped.sum() 并重新运行所有三行。

如果您在自己的 Jupyter 笔记本单元格中运行 week_grouped.sum(),您将看到语句将输出返回到单元格的输出,而不是将结果分配回 week_grouped。一些 pandas 方法有一个 inplace=True 参数(例如,df.sort_values(by=col_name, inplace=True)),但 sum 没有。

编辑:每周编号是否仅在您的 CSV 中出现一次?如果是这样,这是一个不使用groupby的更简单的解决方案:

df = pd.read_csv('input.csv')
df[['id', 'count']].to_csv('output.csv')

【讨论】:

  • 在原始数据中,星期出现在多行中。在这种情况下,groupby 用于将周汇总在一起,因此可以每周进行一次计数。
  • 顺便说一句 - 非常感谢您解释为什么 sum 是一个问题。
【解决方案3】:

Group By 返回键值对,其中键是组的标识符,值是组本身,即与键匹配的原始 df 的子集。

在您的示例中,week_grouped = df.groupby('week') 是一组组(pandas.core.groupby.DataFrameGroupBy 对象),您可以按如下方式详细探索:

for k, gr in week_grouped:
    # do your stuff instead of print
    print(k)
    print(type(gr)) # This will output <class 'pandas.core.frame.DataFrame'>
    print(gr)
    # You can save each 'gr' in a csv as follows
    gr.to_csv('{}.csv'.format(k))

或者,您也可以在分组对象上计算聚合函数

result = week_grouped.sum()
# This will be already one row per key and its aggregation result
result.to_csv('result.csv') 

在您的示例中,您需要将函数结果分配给某个变量,因为默认情况下 pandas 对象是不可变的。

some_variable = week_grouped.sum() 
some_variable.to_csv('week_grouped.csv') # This will work

基本上 result.csv 和 week_grouped.csv 应该是相同的

【讨论】:

  • 感谢您的深入解释。有助于了解系统而不仅仅是问题。
【解决方案4】:

我觉得没有必要使用groupby,你也可以直接删除你不想要的列。

df = df.drop(['month','year'], axis=1)
df.reset_index()
df.to_csv('Your path')

【讨论】:

  • 应该是“axis=1”...但是是的,这将输出行但不按周或状态分组。
【解决方案5】:

Pandas groupby 会生成大量信息(计数、平均值、标准差……)。如果要将它们全部保存在 csv 文件中,首先需要将其转换为常规 Dataframe:

import pandas as pd
...
...
MyGroupDataFrame = MyDataFrame.groupby('id')
pd.DataFrame(MyGroupDataFrame.describe()).to_csv("myTSVFile.tsv", sep='\t', encoding='utf-8')

【讨论】:

    【解决方案6】:

    ##嘿, 我才发现这个!! 我们也可以尝试对 groupby 结果进行切片并在 csv 中读取。 试试这个:##

    week_grouped = df.groupby('week')
    length=len(week_grouped)
    week_grouped[0:length].to_csv("results.csv")
    

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      相关资源
      最近更新 更多