今天在想替换一个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开始的数。