Pandas重置Series的索引以删除多重索引。

41

我有一个长这样的Series:

1999-03-31  SOLD_PRICE     NaN
1999-06-30  SOLD_PRICE     NaN
1999-09-30  SOLD_PRICE     NaN
1999-12-31  SOLD_PRICE    3.00
2000-03-31  SOLD_PRICE    3.00

具有类似于以下指数的索引:

MultiIndex
[(1999-03-31 00:00:00, u'SOLD_PRICE'), (1999-06-30 00:00:00, u'SOLD_PRICE'), 
 (1999-09-30 00:00:00, u'SOLD_PRICE'), (1999-12-31 00:00:00, u'SOLD_PRICE'),...]

我不希望第二列作为索引。理想情况下,我希望有一个DataFrame,其中第一列为“日期”,第二列为“销售”(删除索引的第二级)。我不太清楚如何重新配置索引。


6
一般评论:用数字来表示变量顺序的命名方法很容易出问题。考虑一种极端情况,如果 pandas 没有 DataFrameSeries,而只是称为 DataStructure1DataStructure2,它们的所有方法都被称为 method1method2 等等。给你的变量赋予有意义的名称可以使其他人第一次阅读代码时更易理解。给变量赋予有意义的名称还能让在一个月后重新回到自己的代码并快速上手。 - Phillip Cloud
4个回答

61

只需调用reset_index()函数:

In [130]: s
Out[130]:
0           1
1999-03-31  SOLD_PRICE   NaN
1999-06-30  SOLD_PRICE   NaN
1999-09-30  SOLD_PRICE   NaN
1999-12-31  SOLD_PRICE     3
2000-03-31  SOLD_PRICE     3
Name: 2, dtype: float64

In [131]: s.reset_index()
Out[131]:
            0           1   2
0  1999-03-31  SOLD_PRICE NaN
1  1999-06-30  SOLD_PRICE NaN
2  1999-09-30  SOLD_PRICE NaN
3  1999-12-31  SOLD_PRICE   3
4  2000-03-31  SOLD_PRICE   3

有很多方法可以删除列:

调用reset_index()两次并指定列:

In [136]: s.reset_index(0).reset_index(drop=True)
Out[136]:
            0   2
0  1999-03-31 NaN
1  1999-06-30 NaN
2  1999-09-30 NaN
3  1999-12-31   3
4  2000-03-31   3

重置索引后删除列:
In [137]: df = s.reset_index()

In [138]: df
Out[138]:
            0           1   2
0  1999-03-31  SOLD_PRICE NaN
1  1999-06-30  SOLD_PRICE NaN
2  1999-09-30  SOLD_PRICE NaN
3  1999-12-31  SOLD_PRICE   3
4  2000-03-31  SOLD_PRICE   3

In [139]: del df[1]

In [140]: df
Out[140]:
            0   2
0  1999-03-31 NaN
1  1999-06-30 NaN
2  1999-09-30 NaN
3  1999-12-31   3
4  2000-03-31   3

在重置之后调用drop()

In [144]: s.reset_index().drop(1, axis=1)
Out[144]:
            0   2
0  1999-03-31 NaN
1  1999-06-30 NaN
2  1999-09-30 NaN
3  1999-12-31   3
4  2000-03-31   3

然后在重置索引之后,只需重新命名列即可。

In [146]: df.columns = ['Date', 'Sales']

In [147]: df
Out[147]:
         Date  Sales
0  1999-03-31    NaN
1  1999-06-30    NaN
2  1999-09-30    NaN
3  1999-12-31      3
4  2000-03-31      3

16

当您使用双括号(例如

H3 = H2[['SOLD_PRICE']]

H3变成了一个DataFrame。如果你使用单括号,

H3 = H2['SOLD_PRICE']

那么H3就变成了一个Series对象。如果H3是一个Series对象,那么您需要的结果就会自然而然地出现:

import pandas as pd
import numpy as np
rng = pd.date_range('1/1/2011', periods=72, freq='M')
H2 = pd.DataFrame(np.arange(len(rng)), index=rng, columns=['SOLD_PRICE'])
H3 = H2['SOLD_PRICE']
H5 = H3.resample('Q', how='count')
H6 = pd.rolling_mean(H5,4)
print(H6.head())
产出。
2011-03-31   NaN
2011-06-30   NaN
2011-09-30   NaN
2011-12-31     3
2012-03-31     3
dtype: float64

0

要从MultiIndex中删除特定级别,请使用droplevel。例如,要删除第二个级别:

H6 = H6.droplevel(1)

然后将Series转换为dataframe,使用to_frame

H6 = H6.to_frame('Sales')

res1


如果您想将Series转换为具有2列的数据框,则使用droplevel()+reset_index()或两个带有不同参数的reset_index()调用即可完成任务。
H6 = H6.droplevel(1).rename_axis('Date').reset_index(name='Sales')
# or 
H6 = H6.reset_index(level=0, name='Sales').reset_index(drop=True)

res2


0

使用 numpy.squeeze()

拥有一个多级索引的数据框:

import pandas as pd 

df = pd.DataFrame([[1,2], [2,3]], columns=[['col1', 'col2']])
print(df.columns)

使用MultiIndex创建多级索引,其中包含列名为:('col1',), ('col2',)

然后使用np.squeeze()函数来压缩数值:

import numpy as np

val = np.squeeze(df.values).T
df_ = pd.DataFrame(val, [x[0] for x in df.columns]).T
print(df_.columns)

索引(['col1','col2'],dtype ='object')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接