通常情况下,当一个数据帧经历一个 reset_index(),新的列被分配名称 index或 level_i取决于水平。
reset_index()
index
level_i
是否可以为新列分配一个名称?
You can call rename on the returned df from reset_index:
rename
reset_index
In [145]: # create a df df = pd.DataFrame(np.random.randn(5,3)) df Out[145]: 0 1 2 0 -2.845811 -0.182439 -0.526785 1 -0.112547 0.661461 0.558452 2 0.587060 -1.232262 -0.997973 3 -1.009378 -0.062442 0.125875 4 -1.129376 3.282447 -0.403731
Set the index name
In [146]: df.index = df.index.set_names(['foo']) df Out[146]: 0 1 2 foo 0 -2.845811 -0.182439 -0.526785 1 -0.112547 0.661461 0.558452 2 0.587060 -1.232262 -0.997973 3 -1.009378 -0.062442 0.125875 4 -1.129376 3.282447 -0.403731
call reset_index and chain with rename:
In [147]: df.reset_index().rename(columns={df.index.name:'bar'}) Out[147]: bar 0 1 2 0 0 -2.845811 -0.182439 -0.526785 1 1 -0.112547 0.661461 0.558452 2 2 0.587060 -1.232262 -0.997973 3 3 -1.009378 -0.062442 0.125875 4 4 -1.129376 3.282447 -0.403731
Thanks to @ayhan
alternatively you can use rename_axis to rename the index prior to reset_index:
rename_axis
In [149]: df.rename_axis('bar').reset_index() Out[149]: bar 0 1 2 0 0 -2.845811 -0.182439 -0.526785 1 1 -0.112547 0.661461 0.558452 2 2 0.587060 -1.232262 -0.997973 3 3 -1.009378 -0.062442 0.125875 4 4 -1.129376 3.282447 -0.403731
or just overwrite the index name directly first:
df.index.name = 'bar'
and then call reset_index
For a Series you can specify the name directly. E.g.:
>>> df.groupby('s1').size().reset_index(name='new_name') s1 new_name 0 b 1 1 r 1 2 s 1
You could do this (Jan of 2020):
df = df.reset_index().rename(columns={'index': 'bar'}) print(df) bar 0 1 2 0 0 -2.845811 -0.182439 -0.526785 1 1 -0.112547 0.661461 0.558452 2 2 0.587060 -1.232262 -0.997973 3 3 -1.009378 -0.062442 0.125875 4 4 -1.129376 3.282447 -0.403731
If you're using reset_index() to go from a Series to a DataFrame you can name the column like this
my_series.rename('Example').reset_index()
If you are seeking one-liners that return a new DataFrame, use assign. Here's an example:
assign
>>> df = pd.DataFrame({"a": [4.4, 2.2], "b": 8}, index=[10, 20]) >>> df a b 10 4.4 8 20 2.2 8
Assign a bar Series with the index values, but keep the original index:
bar
>>> df.assign(bar=df.index) a b bar 10 4.4 8 10 20 2.2 8 20
Similar, but drop the index:
>>> df.assign(bar=df.index).reset_index(drop=True) a b bar 0 4.4 8 10 1 2.2 8 20