今天在想替換一個DateFrame中的index時碰到這個問題,理所當然的以為應該使用reindex(),后來發(fā)現(xiàn)是我沒用對這兩個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完全不重合,那么產(chǎn)生的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
所以該函數(shù)并不能實現(xiàn)完全替換index,而保持住原有dataframe中的元素。如果只是想完全替換原有的index,其他該有的數(shù)據(jù)照樣按原來的順序排列,就得用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開始的數(shù)字,可以直接使用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
以上方法結(jié)果顯示原來的index還包含在新的dataframe中,這時候可以使用reset_index(drop=True)來丟棄原來的index.
總結(jié)
dataframe.reindex()
- 原來dataframe中index在新產(chǎn)生的dateframe中無對應行的,該行元素會全部被置為NaN
- 可以指定fill_value,默認為NaN
set_index()
- 本意是用dataframe中的某一列的值設(shè)置dataframe的index
- 也可以用new_index去設(shè)置
reset_index()
- 將以前index覆蓋為從0開始的數(shù)。