【问题标题】:Merge the first row with the column headers in a dataframe将第一行与数据框中的列标题合并
【发布时间】:2019-08-10 03:46:28
【问题描述】:

我正在尝试清理 Excel 文件以进行进一步研究。我遇到的问题,我想合并第一行和第二行。我现在拥有的代码:

xl = pd.ExcelFile("nanonose.xls")
df = xl.parse("Sheet1")
df = df.drop('Unnamed: 2', axis=1)
## Tried this line but no luck
##print(df.head().combine_first(df.iloc[[0]]))

这个的输出是:

      Nanonose     Unnamed: 1     A     B    C          D          E  \
0  Sample type  Concentration   NaN   NaN  NaN        NaN        NaN   
1        Water           9200  95.5  21.0  6.0  11.942308  64.134615   
2        Water           9200  94.5  17.0  5.0   5.484615  63.205769   
3        Water           9200  92.0  16.0  3.0  11.057692  62.586538   
4        Water           4600  53.0   7.5  2.5   3.538462  35.163462   

           F         G         H  
0        NaN       NaN       NaN  
1  21.498560  5.567840  1.174135  
2  19.658560  4.968000  1.883444  
3  19.813120  5.192480  0.564835  
4   6.876207  1.641724  0.144654 

所以,我的目标是合并第一行和第二行以获得: 样本类型 |浓度 |一个 |乙| C | D | E | F |克| H

有人可以帮我合并这两行吗?

【问题讨论】:

  • 不合并前两行
  • 如果有帮助,您可以接受其中一个答案。谢谢!

标签: python pandas dataframe


【解决方案1】:

我认为你需要numpy.concatenate,类似cᴏʟᴅsᴘᴇᴇᴅ 回答:

df.columns = np.concatenate([df.iloc[0, :2], df.columns[2:]])
df = df.iloc[1:].reset_index(drop=True)
print (df)
  Sample type Concentration     A     B    C          D          E          F  \
0       Water          9200  95.5  21.0  6.0  11.942308  64.134615  21.498560   
1       Water          9200  94.5  17.0  5.0   5.484615  63.205769  19.658560   
2       Water          9200  92.0  16.0  3.0  11.057692  62.586538  19.813120   
3       Water          4600  53.0   7.5  2.5   3.538462  35.163462   6.876207   

          G         H  
0  5.567840  1.174135  
1  4.968000  1.883444  
2  5.192480  0.564835  
3  1.641724  0.144654  

【讨论】:

    【解决方案2】:

    只需重新分配df.columns

    df.columns = np.append(df.iloc[0, :2], df.columns[2:])
    

    或者,

    df.columns = df.iloc[0, :2].tolist() + (df.columns[2:]).tolist()
    

    接下来,跳过第一行。

    df = df.iloc[1:].reset_index(drop=True) 
    df
      Sample type Concentration     A     B    C          D          E          F  \
    0       Water          9200  95.5  21.0  6.0  11.942308  64.134615  21.498560   
    1       Water          9200  94.5  17.0  5.0   5.484615  63.205769  19.658560   
    2       Water          9200  92.0  16.0  3.0  11.057692  62.586538  19.813120   
    3       Water          4600  53.0   7.5  2.5   3.538462  35.163462   6.876207   
    
              G         H  
    0  5.567840  1.174135  
    1  4.968000  1.883444  
    2  5.192480  0.564835  
    3  1.641724  0.144654 
    

    reset_index 如果您希望最终输出的索引为 0,则可选。

    【讨论】:

      【解决方案3】:

      获取第二行标题中存在的所有列,然后是第一行标题。将它们组合成一个“所有列名称标题”列表。现在通过将标题作为标题 [0,1] 创建一个带有 excel 的 df。现在将其标题替换为您之前创建的所有列名标题。

      import pandas as pd
      
      #reading Second header row columns
      df1 = pd.read_excel('nanonose.xls', header=[1] , index = False)
      cols1 = df1.columns.tolist()
      SecondRowColumns = []
      for c in cols1:
          if ("Unnamed" or "NaN" not in c):
              SecondRowColumns.append(c)     
      
      #reading First header row columns
      df2 = pd.read_excel('nanonose.xls', header=[0] , index = False)
      cols2 = df2.columns.tolist()
      FirstRowColumns = []
      for c in cols2:
          if ("Unnamed" or "Nanonose" not in c):
              FirstRowColumns.append(c)       
      
      AllColumn = []
      AllColumn = SecondRowColumns+ FirstRowColumns
      
      
      
      df = pd.read_excel('nanonose.xls', header=[0,1] , index=False)
      df.columns = AllColumn
      print(df)
      

      【讨论】:

      • 如果您解释了您提供的代码如何回答问题,这将是一个更好的答案。
      • 我一直在寻找这种方法 :) 谢谢
      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 2014-10-03
      • 1970-01-01
      • 2018-05-07
      • 2021-08-28
      • 2015-08-16
      • 2019-06-26
      • 2021-07-21
      相关资源
      最近更新 更多