【问题标题】:Pandas reset index on series to remove multiindexPandas 重置系列索引以删除多索引
【发布时间】:2013-09-08 13:30:07
【问题描述】:

我从DataFrame 创建了一个Series,当我用计数重新采样一些数据时 像这样:H2DataFrame

H3=H2[['SOLD_PRICE']]
H5=H3.resample('Q',how='count')
H6=pd.rolling_mean(H5,4)

这产生了一个如下所示的系列:

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,第 1 列为“日期”,第 2 列为“销售”(删除索引的第二级)。我不太明白如何重新配置​​索引。

【问题讨论】:

  • 只是一般性评论:用数字命名变量,指示您使用它们的顺序是灾难的根源。考虑pandas 没有DataFrameSeries 的病理情况,它们只是被称为DataStructure1DataStructure2,它们的所有方法都被称为method1method2 等等.给你的变量起有意义的名字将使你的代码对于第一次阅读它的其他人来说是易读的。为您的变量赋予有意义的名称还可以让在一个月内回到您的代码并快速恢复速度。
  • 好建议,再次感谢

标签: python pandas


【解决方案1】:

只需拨打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

【讨论】:

    【解决方案2】:

    当你使用双括号时,比如

    H3 = H2[['SOLD_PRICE']]
    

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

    H3 = H2['SOLD_PRICE']
    

    然后 H3 变成一个系列。如果 H3 是一个系列,那么您想要的结果自然如下:

    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
    

    【讨论】:

    • 我也喜欢这个!!很难选择...当我努力跟上进度时,你们俩就像坐在我肩上的天使。正是像你们这样的人让 Python 社区对新手如此友好。谢谢 +unutbu 和 +Phillip Cloud
    • 我实际上这是我正在使用的解决方案,但我还需要了解如何更好地操作 Phillip 解释的系列对象..下面..
    猜你喜欢
    • 2019-01-16
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多