【问题标题】:Using the DataFrame.set_index() method [duplicate]使用 DataFrame.set_index() 方法[重复]
【发布时间】:2019-10-16 02:38:08
【问题描述】:

早上好,

我在两列中有一些错误和时间数据:

edf = pd.DataFrame({'error':error, 'time':time})

这给出了:

            error    time
0     0.000000e+00 -10.000
1     4.219215e-28  -9.995
2     8.870728e-28  -9.990
3     1.398745e-27  -9.985
4     1.960445e-27  -9.980
5     2.575915e-27  -9.975
6     3.249142e-27  -9.970
7     3.984379e-27  -9.965
8     4.786157e-27  -9.960
9     5.659303e-27  -9.955
10    6.608959e-27  -9.950

根据文档,我可以使用edf.set_index('time', drop=True) 将时间列设置为我的索引,并将其从数据框中的先前位置删除(我相信它默认会删除)。但是,这绝对没有任何作用。事实上,我很困惑,我决定直接从文档中复制并粘贴代码示例,实际上它也不起作用。

df = pd.DataFrame({'month': [1, 4, 7, 10],
                   'year': [2012, 2014, 2013, 2014],
                   'sale': [55, 40, 84, 31]})

这给了,

   month  year  sale
0      1  2012    55
1      4  2014    40
2      7  2013    84
3     10  2014    31

之后,df.set_index('month') 也给出:

   month  year  sale
0      1  2012    55
1      4  2014    40
2      7  2013    84
3     10  2014    31

而不是文档宣传的内容:

       year  sale
month
1      2012    55
4      2014    40
7      2013    84
10     2014    31

什么给了?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    set_index 默认返回新的数据框。所以使用:

    # recommended
    edf.set_index('time', drop=True, inplace=True)
    

    edf = edf.set_index('time', drop=True)
    

    【讨论】:

    • 就个人而言,我总是更喜欢明确,从不使用inplace(即我总是使用第二种方法)。事实上,inplace 预计会被弃用。 github.com/pandas-dev/pandas/issues/16529
    • 链接的 GitHub 问题仍在讨论中,尚未最终确定。根据我的经验,inplace=True 有时确实可以节省大量内存。
    • 这当然值得商榷,这就是我强调意见分歧的原因。我不相信内存使用会有任何差异。你有什么参考资料可以让我了解更多吗?以下是关于就地的更多讨论:stackoverflow.com/questions/45570984/…
    • @Alexander 我没有任何参考资料。这纯粹来自我的经验。但是,从您的链接中,inplace is good 确实显示了内存使用量的差异。
    • in-place is bad! 链接向他们展示了该示例在实践中可能不成立。我认为我们可以同意这是关于最佳实践的分歧点。
    【解决方案2】:

    默认情况下,大多数数据帧操作不会修改原始数据帧。相反,它们会返回一个新的数据框。

    您可以将该结果分配给一个新变量或同一个变量:

    df = df.set_index('month')
    

    或者您可以将参数传递给函数,告诉它修改原始数据框:

    df.set_index('month', inplace=True)
    

    当我开始使用 Pandas 时,这让我大吃一惊。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      相关资源
      最近更新 更多