【问题标题】:Pandas: Multiple indices in a dataframe: drop some, keep othersPandas:数据框中的多个索引:删除一些,保留其他
【发布时间】:2021-12-30 16:18:37
【问题描述】:

我的数据结构如下:

>>> df.head()
                                   value
Date       FIPS_state Date              
2001-01-01 1          2001-03-31  6.4621
           2          2001-03-31 11.3259
           4          2001-03-31  6.3467
           5          2001-03-31  6.0613
           6          2001-03-31  7.5069

[为了方便起见,我想在此处发布此数据框,但我现在什至无法弄清楚。但是请参阅data 以及进一步向下概述的步骤以重新创建它。]

想要的输出是:

>>> df.head()                                   
   FIPS_state Date        value      
0  1          2001-03-31  6.4621
1  2          2001-03-31 11.3259
2  4          2001-03-31  6.3467
3  5          2001-03-31  6.0613
4  6          2001-03-31  7.5069

我想删除第一个 Date 索引但保留第二个 Date 索引,并将 FIPS_state 索引作为变量。

也许我一开始就不应该在这里。 Date 索引是在运行以下命令时创建的:

import pandas
from pandas import Timestamp

data = pandas.DataFrame.from_dict({'FIPS_state': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1}, 'FIPS_county': {0: 3, 1: 3, 2: 3, 3: 3, 4: 3}, 'value': {0: 3.1, 1: 3.4, 2: 3.9, 3: 5.9, 4: 6.4}, 'Date': {0: Timestamp('2020-12-01 00:00:00'), 1: Timestamp('2020-11-01 00:00:00'), 2: Timestamp('2020-10-01 00:00:00'), 3: Timestamp('2020-09-01 00:00:00'), 4: Timestamp('2020-08-01 00:00:00')}, 'Month/Year': {0: '12/2020', 1: '11/2020', 2: '10/2020', 3: '9/2020', 4: '8/2020'}})

df = data.set_index('Date').groupby(['Date','FIPS_state']).resample('Q')['value'].mean().to_frame()

>>> df.head()
#   FIPS_state FIPS_county  value       Date Month/Year
# 0          1           3 3.1000 2020-12-01    12/2020
# 1          1           3 3.4000 2020-11-01    11/2020
# 2          1           3 3.9000 2020-10-01    10/2020
# 3          1           3 5.9000 2020-09-01     9/2020
# 4          1           3 6.4000 2020-08-01     8/2020

编辑:这甚至没有做正确的计算,是吗?哦,我的...无论如何,@user17242583 在下面回答了我关于索引的问题,谢谢!

【问题讨论】:

  • 我曾多次尝试涉及.reset_index(inplace=True, drop=True).rename_axis(None),但我敢说我对这些指标没有很好的了解。
  • 你的输出不会对你的 df 做任何事情,它是一样的
  • 我也注意到了...
  • @BENY 和用户:看起来我在重新采样数据时搞砸了,对吧?
  • @PatrickT 是的,我就是这样

标签: python pandas pandas-groupby multi-index


【解决方案1】:

我觉得你需要

df.groupby([pd.Grouper(key='Date', freq='Q'), 'FIPS_state'])['value'].mean().reset_index()

        Date  FIPS_state     value
0 2020-09-30           1  6.150000
1 2020-12-31           1  3.466667

【讨论】:

  • 谢谢@BENY!一分钟前我接受了另一个答案,但你的答案非常及时,最终这是我需要解决的问题。我之前曾尝试使用pandas.Grouper,但没能理解它(在有限的时间和精力下)。这很有帮助!顺便说一句,我从你对 pandas 数据框的许多答案中学到了很多东西。伟大的贡献!
  • 你也是一个很好的熊猫老师@PatrickT。 :) 在这个问题之前,我不知道将 MultiIndex 转换为普通列是多么容易:D
【解决方案2】:

您可以通过从索引中删除第一个 Date 列(或任何 Date 列 - 不应该有重复的列名)来做到这一点:

df.index = df.index.droplevel(0)

然后重置索引:

df = df.reset_index()

输出:

>>> df
   FIPS_state        Date    value
0           1  2001-03-31   6.4621
1           2  2001-03-31  11.3259
2           4  2001-03-31   6.3467
3           5  2001-03-31   6.0613
4           6  2001-03-31   7.5069

【讨论】:

  • 纯魔法!谢谢!你知道我应该如何实施resample('Q') 步骤来避免这个问题吗?
  • 重复项在索引中,或者在重新采样时管道方法的某些时候它是否也在列名中?
  • 嗯...对resample()知之甚少,我无法给出太多建议。我不确定为什么 Date 列会重复。不过可以肯定的是,它在索引中重复了。
  • 使用 groupby 总是会创建一个新的数据框,其中索引是您分组的列,因此具有 FPS_state 和 Date 的 MultiIndex 是因为您在 groupby 中指定了这些列。
  • 您调用mean(),它只返回一个系列...索引是那个多索引,所以也许您可以删除系列的整个索引并将其直接分配给 df 像这样? df['val'] = df.set_index('Date').groupby(['Date','FIPS_state']).resample('Q')['value'].mean().reset_index(drop=True)
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2018-10-13
相关资源
最近更新 更多