pandas中的reindex()和set_index()

今天在想替换一个DateFrame中的index时碰到这个问题,理所当然的以为应该使用reindex(),后来发现是我没用对这两个api。

reindex()

DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)

这里的labels如果是和原来的index完全不重合,那么产生的dataframe的所有元素将是NaN。
例子:

import pandas as pd
index = ['Firefox', 'Chrome', 'Safari', 'IE10', 'Konqueror']
df = pd.DataFrame({'http_status': [200, 200, 404, 404, 301],
                   'response_time': [0.04, 0.02, 0.07, 0.08, 1.0]},
                  index=index)
df
Out[5]: 
           http_status  response_time
Firefox            200           0.04
Chrome             200           0.02
Safari             404           0.07
IE10               404           0.08
Konqueror          301           1.00
new_index = ['Safari', 'Iceweasel', 'Comodo Dragon', 'IE10',
             'Chrome']
df.reindex(new_index)
Out[7]: 
               http_status  response_time
Safari               404.0           0.07
Iceweasel              NaN            NaN
Comodo Dragon          NaN            NaN
IE10                 404.0           0.08
Chrome               200.0           0.02
df.reindex(range(5))
Out[8]: 
   http_status  response_time
0          NaN            NaN
1          NaN            NaN
2          NaN            NaN
3          NaN            NaN
4          NaN            NaN

所以该函数并不能实现完全替换index,而保持住原有dataframe中的元素。如果只是想完全替换原有的index,其他该有的数据照样按原来的顺序排列,就得用set_index()

set_index()

DataFrame.set_index(*keys*, *drop=True*, *append=False*, *inplace=False*, *verify_integrity=False*)

df = pd.DataFrame({'http_status': [200, 200, 404, 404, 301],
                   'response_time': [0.04, 0.02, 0.07, 0.08, 1.0]},
                  index=index)
df
Out[14]: 
           http_status  response_time
Firefox            200           0.04
Chrome             200           0.02
Safari             404           0.07
IE10               404           0.08
Konqueror          301           1.00
df.set_index(pd.Index(range(5)))
Out[15]: 
   http_status  response_time
0          200           0.04
1          200           0.02
2          404           0.07
3          404           0.08
4          301           1.00

当然如果只是想把原先的index重新变成从0开始的数字,可以直接使用dataframe.reset_index()

df = pd.DataFrame([('bird', 389.0),
                   ('bird', 24.0),
                   ('mammal', 80.5),
                   ('mammal', np.nan)],
                  index=['falcon', 'parrot', 'lion', 'monkey'],
                  columns=('class', 'max_speed'))
df
Out[19]: 
         class  max_speed
falcon    bird      389.0
parrot    bird       24.0
lion    mammal       80.5
monkey  mammal        NaN

df.reset_index()
Out[20]: 
    index   class  max_speed
0  falcon    bird      389.0
1  parrot    bird       24.0
2    lion  mammal       80.5
3  monkey  mammal        NaN

以上方法结果显示原来的index还包含在新的dataframe中,这时候可以使用reset_index(drop=True)来丢弃原来的index.

总结

dataframe.reindex()

  • 原来dataframe中index在新产生的dateframe中无对应行的,该行元素会全部被置为NaN
  • 可以指定fill_value,默认为NaN

set_index()

  • 本意是用dataframe中的某一列的值设置dataframe的index
  • 也可以用new_index去设置

reset_index()

  • 将以前index覆盖为从0开始的数。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容