【问题标题】:Output and preserve groupby index structure without aggregate function输出并保留没有聚合函数的 groupby 索引结构
【发布时间】:2021-08-21 19:16:38
【问题描述】:

我有一个数据框,我想按年份分组,然后是每年的月份。由于数据非常庞大(从30年前记录到现在),我希望将输出如下所示以供后续计算,但后面没有任何聚合函数如“.mean()”。

但是,我无法这样做,因为 groupby 始终需要 .agg,否则它将显示此错误:

另一方面,我有点担心导入为系列,因为我不知道如何设置参数以获得与下面完全相同的格式。另一个原因是我使用以下几行将 .csv 导入数据框:

df=pd.read_csv(r'file directory', index_col = 'date')
df.index = pd.to_datetime(df.index)

由于一些奇怪的原因,如果我在 pd.read_csv 中定义要导入的日期字符串格式,然后尝试根据年份和月份、函数或方法按其他方法排序,当记录的日期开始时会混淆01(日)/01(月)/1990 年和 01(日)/02(月)/1990 年。比如将一月的第一个数字解释为日,第二个数字解释为月,并按时间顺序排序,但是到了二月,当日应该是01时,该方法认为01是月,02是日部分并将 2 月的记录移至 Jan 组。

有没有办法实现相同的格式?

下面帖子中显示的方法似乎无法帮助我获得我想要的格式:Pandas - Groupby dataframe store as dataframe without aggregating

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    IIUC:

    您可以在to_datetime() 中使用dayfirst 参数并将其设置为等于True 然后创建'Year' 和'Month' 列并使其成为索引和排序索引:

    df=pd.read_csv(r'file directory')
    df['date']=pd.to_datetime(df['date'],dayfirst=True)
    df['Year']=df['date'].dt.year
    df['Month']=df['date'].dt.month
    df=df.set_index(['Year','Month']).sort_index()
    

    或通过assign()分三步:

    df=pd.read_csv(r'file directory')
    df['date']=pd.to_datetime(df['date'],dayfirst=True)
    df=(df.assign(Year=df['date'].dt.year,Month=df['date'].dt.month)
          .set_index(['Year','Month']).sort_index())
    

    【讨论】:

    • 嗨 Anurag,对于这两种方法,它们都不起作用,因为它返回 Keyerror 'date'。
    • @user14074078 用实际数据集中具有类似日期值的列替换“日期”...这里“日期”是类似日期列的占位符
    • 我发现了问题,我的 read_csv 有一个参数 index_col = 'date'。删除该部分后,您的代码将起作用。因为我意识到我的后续处理需要它,所以我对您的代码进行了一些修改以包含 day。非常感谢!
    【解决方案2】:

    您可以遍历 groupby 结果的组。

    import pandas as pd
    import numpy as np
    rand = np.random.RandomState(1)
    df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
                       'B': rand.randn(6),
                       'C': rand.randint(0, 20, 6)})
    groupby_obj = df.groupby(['A'])
    
    for k, gdf in groupby_obj:
        print('Groupby Key:', k)
        print('Dataframe:\n', gdf, '\n')
    

    您可以在gdf上应用所有数据框方法

    【讨论】:

    • 嗨 Asrst,我在导入后做了一个 df.index.values,我看到了以下输出:array(['1990-01-01', '1990-01-02', '1990 -01-03', ..., '2020-12-29', '2020-12-30', '2020-12-31'] 另外,我的 groupby 不允许我在没有附加方法的情况下分配它后面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2012-11-14
    • 2015-05-18
    • 2021-11-05
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多