【问题标题】:Turn the column headers into the first row and row headers into the first column in Pandas dataframe在 Pandas 数据框中将列标题转换为第一行,将行标题转换为第一列
【发布时间】:2018-11-13 22:02:35
【问题描述】:

我有一个如下所示的数据框:

123  345   456   789
987  876   765   543
...  ...   ...   ...

但是当它们实际上是值时,顶行和最左边的列被视为标题。有没有办法将它们向下/向右移动并用默认索引替换它们?

编辑:我已经考虑过设置 header=None,但这不是一个选项。数据框是通过 read_excel 创建的,但程序的许多部分已经使用 .loc 等并直接引用要删除的标头名称。

【问题讨论】:

  • 这个数据框是如何以这种明显错误的方式创建的?您是否将数据导入数据框中?你对它的创建方式有影响吗?没有标题的数据在放入数据帧时应该已经被处理。
  • 在读取文件pd.read_csv(..., header=None) 时应该解决这个问题。也就是说,重置index 很容易df.reset_index()。这些列有点烦人df.T.reset_index().T。但是,如果您真的需要两者,那么您需要解决导致的第一个位置的内容。意思是,数据框的左上角没有值。我想你需要一个minimal reproducible example

标签: python pandas dataframe indexing


【解决方案1】:

对于您的解决方案,您可以转移它。但是,如果您正在从任何 csv 文件中读取数据,则在读取时可以考虑不使用 header(header = None)

    345 456 789
123         
987 876 765 543

df.reset_index().T.reset_index().T

输出:

         0  1   2   3
index   123 345 456 789
0       987 876 765 543


pd.read_csv('data.csv',header=None)

输出:

    0   1   2   3
0   123 345 456 789
1   987 876 765 543

【讨论】:

    【解决方案2】:

    使用参数index_col=[0],默认第一行转换为列名,所以不需要参数:

    import pandas as pd
    
    temp=u"""123;345;456;789
    987;876;765;543"""
    #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(pd.compat.StringIO(temp), sep=";", index_col=[0])
    
    print (df)
         345  456  789
    123               
    987  876  765  543
    

    如果输入数据是没有标头的DataFrame:

    print (df)
         0    1    2    3
    0  123  345  456  789
    1  987  876  765  543
    
    #set first row to columns
    df.columns = df.iloc[0]
    #remove first row from data and remove columns name
    df = df.iloc[1:].rename_axis(None, axis=1)
    #set index by first column
    df = df.set_index(df.columns[0])
    print (df)
         345  456  789
    123               
    987  876  765  543
    

    如果数据中可能存在相同类型的值,请使用 numpy 和索引:

    arr = df.values
    df = pd.DataFrame(arr[1:,1:], index=arr[1:,0], columns=arr[0,1:])
    df.index.name = arr[0,0]
    print (df)
         345  456  789
    123               
    987  876  765  543
    

    【讨论】:

      【解决方案3】:

      数据框的创建似乎存在问题。数据框是如何创建的?您很可能可以通过创作解决您的问题

      但是,如果这不是一个选项,请尝试以下方法: pandas.DataFrame.reset_index() 是你想要的。至于列名,只需使用pandas.DataFrame.append()df.columns 作为参数(其中df 是您的数据框)将它们添加为常规行,然后重命名列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-08
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多