【问题标题】:Python Pandas Replacing Header with Top RowPython Pandas 用顶行替换标题
【发布时间】:2015-09-28 11:59:59
【问题描述】:

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

           Unnamed: 1    Unnamed: 2   Unnamed: 3  Unnamed: 4
0   Sample Number  Group Number  Sample Name  Group Name
1             1.0           1.0          s_1         g_1
2             2.0           1.0          s_2         g_1
3             3.0           1.0          s_3         g_1
4             4.0           2.0          s_4         g_2

我正在寻找一种方法来删除标题行并使第一行成为新的标题行,因此新的数据框将如下所示:

    Sample Number  Group Number  Sample Name  Group Name
0             1.0           1.0          s_1         g_1
1             2.0           1.0          s_2         g_1
2             3.0           1.0          s_3         g_1
3             4.0           2.0          s_4         g_2

我已经尝试过 if 'Unnamed' in df.columns: 的内容,然后制作没有标题 df.to_csv(newformat,header=False,index=False) 的数据框,但我似乎没有得到任何结果。

【问题讨论】:

    标签: python pandas header row


    【解决方案1】:

    或者,我们可以在使用 pandas 读取文件时执行此操作。

    我们可以使用这种情况,

    pd.read_csv('file_path',skiprows=1)
    

    读取文件时,这将跳过第一行并将列设置为文件的第二行。

    【讨论】:

    • 这并不能解决问题。第二行中的值不应该是标题值。事实上,这基本上与解决方案应该是相反的。如果 skiprows=-1 会导致第一行用作标题,那将是解决方案。公认的解决方案实现了目标。
    【解决方案2】:

    另一个使用 Python 交换的单行代码:

    df, df.columns = df[1:] , df.iloc[0]
    

    这不会重置索引

    虽然,相反的情况不会像预期的那样工作df.columns, df = df.iloc[0], df[1:]

    【讨论】:

      【解决方案3】:

      最佳实践和Best OneLiner

      df.to_csv(newformat,header=1)
      

      注意标题值:

      标题是指用作列名的行号。没错,行号不是df,而是来自excel文件(0是第一行,1是第二行,依此类推)。

      这样,您将获得所需的列名,而无需编写额外的代码或创建新的 df。

      好消息是,它删除了被替换的行。

      【讨论】:

      • 这只是输出 CSV,它不会改变数据框,对吧?
      • @AMC 回复有点晚。回答你的问题,是的。它对数据框没有影响。
      • 那么这个答案不适用于这个问题,单行也不能解决问题。关键不是生成 CSV;而是生成 CSV。它是用第一行中的值替换数据框的标题。
      • 它替换了熊猫上的数据帧头。代码本身是“df.”,df 是您从 csv 文件中读取数据的数据框
      【解决方案4】:
      header = table_df.iloc[0]
      table_df.drop([0], axis =0, inplace=True)
      table_df.reset_index(drop=True)
      table_df.columns = header
      table_df
      

      【讨论】:

      • 请补充说明
      【解决方案5】:

      这是一个“就地”定义列索引的简单技巧。因为set_index 设置了 row 索引,我们可以通过转置数据框、设置索引并将其转回来对列执行相同的操作:

      df = df.T.set_index(0).T
      

      请注意,如果您的行已经有不同的索引,您可能需要更改 set_index(0) 中的 0

      【讨论】:

        【解决方案6】:

        --另一种方法

        
        df.columns = df.iloc[0]
        df = df.reindex(df.index.drop(0)).reset_index(drop=True)
        df.columns.name = None
        
            Sample Number  Group Number  Sample Name  Group Name
        0             1.0           1.0          s_1         g_1
        1             2.0           1.0          s_2         g_1
        2             3.0           1.0          s_3         g_1
        3             4.0           2.0          s_4         g_2
        
        

        如果你喜欢它,请点击向上箭头。谢谢

        【讨论】:

          【解决方案7】:

          @ostrokach 答案是最好的。您很可能希望在对数据框的任何引用中都保留它,因此会受益于 inplace = True。
          df.rename(columns=df.iloc[0], inplace = True) df.drop([0], inplace = True)

          【讨论】:

            【解决方案8】:

            只需做即可更改数据框

            df.columns = df.iloc[0]
            df = df[1:]
            

            然后

            df.to_csv(path, index=False) 
            

            应该做的伎俩。

            【讨论】:

            • 这是一个更好的答案,因为其中没有多余的代码(new_header)。
            【解决方案9】:

            如果你想要单线,你可以这样做:

            df.rename(columns=df.iloc[0]).drop(df.index[0])
            

            【讨论】:

            • 如果您不希望索引丢失某些内容,请使用 df.rename(columns=df.iloc[0]).drop(df.index[0]).reset_index(drop=True)
            • 在将其设为两行' df.rename(columns=df.iloc[0, :], inplace=True) df.drop(df.index[0],就地=真)
            【解决方案10】:
            new_header = df.iloc[0] #grab the first row for the header
            df = df[1:] #take the data less the header row
            df.columns = new_header #set the header row as the df header
            

            【讨论】:

              猜你喜欢
              • 2014-06-13
              • 2023-03-04
              • 2013-06-22
              • 1970-01-01
              • 1970-01-01
              • 2013-10-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多