Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将数据帧的索引转换为列_Python_Pandas_Dataframe_Indexing_Series - Fatal编程技术网

Python 如何将数据帧的索引转换为列

Python 如何将数据帧的索引转换为列,python,pandas,dataframe,indexing,series,Python,Pandas,Dataframe,Indexing,Series,这似乎相当明显,但我似乎不知道如何将数据帧的索引转换为列 例如: df= gi ptt_loc 0 384444683 593 1 384444684 594 2 384444686 596 print(df) gi ptt_loc 0 384444683 593 4 384444684 594 9 384444686 596 print(df.reset

这似乎相当明显,但我似乎不知道如何将数据帧的索引转换为列

例如:

df=
        gi       ptt_loc
 0  384444683      593  
 1  384444684      594 
 2  384444686      596  
print(df)
          gi  ptt_loc
0  384444683      593
4  384444684      594
9  384444686      596

print(df.reset_index())
   index         gi  ptt_loc
0      0  384444683      593
1      4  384444684      594
2      9  384444686      596

print(df.reset_index().set_index('index', drop=False))
       index         gi  ptt_loc
index
0          0  384444683      593
4          4  384444684      594
9          9  384444686      596
对,

要么:

df['index1'] = df.index


因此,如果您有一个包含3级索引的多索引框架,如:

>>> df
                       val
tick       tag obs        
2016-02-26 C   2    0.0139
2016-02-27 A   2    0.5577
2016-02-28 C   6    0.0303
如果要将索引中的第一个(
勾选
)和第三个(
obs
)级别转换为列,可以执行以下操作:

>>> df.reset_index(level=['tick', 'obs'])
          tick  obs     val
tag                        
C   2016-02-26    2  0.0139
A   2016-02-27    2  0.5577
C   2016-02-28    6  0.0303

对于多索引,可以使用

df['si_name'] = R.index.get_level_values('si_name') 

其中,
si_name
是子索引的名称。

为了更清楚一点,让我们看看索引中有两个级别的数据帧(多索引)

使用默认参数调用的
reset_index
方法将所有索引级别转换为列,并使用简单的
RangeIndex
作为新索引

df.reset_index()

使用
level
参数控制将哪些索引级别转换为列。如果可能,请使用级别名称,该名称更明确。如果没有级别名称,则可以通过其整数位置引用每个级别,该位置从外部0开始。可以在此处使用标量值,也可以使用要重置的所有索引的列表

df.reset_index(level='State') # same as df.reset_index(level=0)

如果希望保留索引并将索引转换为列,则可以执行以下操作:

# for a single level
df.assign(State=df.index.get_level_values('State'))

# for all levels
df.assign(**df.index.to_frame())

如果要使用
reset_index
方法并保留现有索引,应使用:

df.reset_index().set_index('index', drop=False)
或在适当的位置进行更改:

df.reset_index(inplace=True)
df.set_index('index', drop=False, inplace=True)
例如:

df=
        gi       ptt_loc
 0  384444683      593  
 1  384444684      594 
 2  384444686      596  
print(df)
          gi  ptt_loc
0  384444683      593
4  384444684      594
9  384444686      596

print(df.reset_index())
   index         gi  ptt_loc
0      0  384444683      593
1      4  384444684      594
2      9  384444686      596

print(df.reset_index().set_index('index', drop=False))
       index         gi  ptt_loc
index
0          0  384444683      593
4          4  384444684      594
9          9  384444686      596
如果您想摆脱索引标签,可以执行以下操作:

df2 = df.reset_index().set_index('index', drop=False)
df2.index.name = None
print(df2)
   index         gi  ptt_loc
0      0  384444683      593
4      4  384444684      594
9      9  384444686      596
+ 您可以先将索引重命名为所需的标签,然后提升为系列:

df = df.rename_axis('index1').reset_index()

print(df)

   index1         gi  ptt_loc
0       0  384444683      593
1       1  384444684      594
2       2  384444686      596
这也适用于
多索引
数据帧:

print(df)
#                        val
# tick       tag obs        
# 2016-02-26 C   2    0.0139
# 2016-02-27 A   2    0.5577
# 2016-02-28 C   6    0.0303

df = df.rename_axis(['index1', 'index2', 'index3']).reset_index()

print(df)

       index1 index2  index3     val
0  2016-02-26      C       2  0.0139
1  2016-02-27      A       2  0.5577
2  2016-02-28      C       6  0.0303

一种非常简单的方法是使用reset_index()方法。对于数据帧df,请使用以下代码:

df.reset_index(inplace=True)
这样,索引将成为一列,使用inplace作为True,这将成为永久性的更改。

这应该可以做到(如果不是多级索引)-


当然,如果您不想在rename的函数参数中为一个新变量赋值,您可以始终设置inplace=True。

您可以在刚刚添加到dataframe的列上设置一个索引,使其成为一个True列和一个索引吗?如果您想转换整个多索引,只需使用
df.reset\u index()
,它将整个索引移动到列中(每层一列),并创建一个从0到len(df)-1I的int索引。我为每个项都有一个元组的分类索引,我只想从元组中的一个项创建一个新列。关于如何从索引中仅提取一项的任何想法?分配给列,例如,
df['index1']=df.index
返回一条警告:“试图在数据帧切片的副本上设置一个值。”请改用df.assign()函数,如下所示。我遇到了类似的问题,尝试此解决方案时没有得到任何结果。然而@venti solution正是我想要的。我建议添加一些关于为什么您认为这个答案比现有答案更好的讨论……使用insert方法的这种方法有助于将列插入数据框的左端(第一列)位置,而不是将列插入右端(最后一列)。因此,在某些情况下,它可能非常有用。通过答案来解释可能更好。这个答案与alread接受的答案有何不同?
df1 = pd.DataFrame({"gi":[232,66,34,43],"ptt":[342,56,662,123]})
p = df1.index.values
df1.insert( 0, column="new",value = p)
df1

    new     gi     ptt
0    0      232    342
1    1      66     56 
2    2      34     662
3    3      43     123
df.reset_index(inplace=True)
df.reset_index().rename({'index':'index1'}, axis = 'columns')