Pandas:数据框中的多个索引:删除一些,保留其他
Pandas: Multiple indices in a dataframe: drop some, keep others
我的数据结构如下:
>>> 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
[为了方便起见,我想 post 在此处使用此数据框,但我现在甚至无法弄清楚。但是,请参阅 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 已经在下面回答了我关于索引的问题,谢谢!
您可以通过从索引中删除第一个 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
我觉得你需要
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
我的数据结构如下:
>>> 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
[为了方便起见,我想 post 在此处使用此数据框,但我现在甚至无法弄清楚。但是,请参阅 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 已经在下面回答了我关于索引的问题,谢谢!
您可以通过从索引中删除第一个 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
我觉得你需要
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