【问题标题】:Combine first row and header with pandas将第一行和标题与熊猫组合
【发布时间】:2020-05-07 06:52:17
【问题描述】:

我正在尝试在 Python 中复制我在 R 中制作的代码,但是当我尝试修复我的标头时遇到了困难。我想合并表头和第一行,但是好像不行。

我的数据目前如下所示:

        Acronym  Project Number    Title     Dates         Unnamed: 4   Unnamed: 5 
0         NaN            NaN        NaN      Start date    Duration     Number of Participants
1         YoYo           5678       blabla   01-01-2020    36           4
2         SPY            1452       blabla   06-03-2018    12           6         
3         NoNo           6280       blabla   02-05-2019    48           8       
4         MaGiK          2749       blabla   01-05-2016    12           9    

我的数据标题分布在两行中。前三个标题是应有的。但是,从第 4 列开始,我的列名位于第二行。简单地组合标题和第一行是行不通的,因为某些列(如第 4 列)在标题和第一行中都有值。

理想情况下,我想做的是将标题保留在前三列中,并将第一行中的值用作第 4 列以后的标题,这样它就变成了:

Acronym | Project Number | Title | Start date  | Duration | Number of Participants

在 R 中,这将通过

来完成
Projects <- Projects %>% 
  set_names(c(names(Projects)[1:3], as.character(.[1,])[4:6])) %>% 
  rownames_to_column("index") %>% 
  filter(index != 1 ) %>% 
  select(-index)

基于 this question 我在 Python 中尝试过这个

Projects_clean.columns = np.concatenate([Projects_clean.iloc[0, :2], Projects_clean.columns[0:3]])

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

但这会返回

 "values have {new} elements".format(old=old_len, new=new_len)

Length mismatch: Expected axis has 24 elements, new values have 10 elements

(根据我的实际数据)。显然,我的新数据与旧数据的列数不同。我做错了什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    转换前 3 列名称和第 3 个值后第一行的所有数据:

    Projects_clean.columns = (Projects_clean.columns[:3].tolist() +  
                              Projects_clean.iloc[0, 3:].tolist())
    

    或者:

    Projects_clean.columns = np.concatenate([Projects_clean.columns[:3], 
                                             Projects_clean.iloc[0, 3:]])
    

    然后:

    Projects_clean = Projects_clean.iloc[1:]
    print (Projects_clean)
      Acronym  Project Number   Title  Start date Duration Number of Participants
    1    YoYo          5678.0  blabla  01-01-2020       36                      4
    2     SPY          1452.0  blabla  06-03-2018       12                      6
    3    NoNo          6280.0  blabla  02-05-2019       48                      8
    4   MaGiK          2749.0  blabla  01-05-2016       12                      9
    

    如果可能,通过 read_csv 中的参数 header=[0,1] 的前 2 行创建 MultiIndex,然后使用:

    Projects_clean = pd.read_csv(file, header=[0,1])
    
    
    Projects_clean.columns = (Projects_clean.columns.get_level_values(0)[:3].tolist() +  
                              Projects_clean.columns.get_level_values(1)[3:].tolist())
    print (Projects_clean)
      Acronym  Project Number   Title  Start date  Duration  \
    1    YoYo            5678  blabla  01-01-2020        36   
    2     SPY            1452  blabla  06-03-2018        12   
    3    NoNo            6280  blabla  02-05-2019        48   
    4   MaGiK            2749  blabla  01-05-2016        12   
    
       Number of Participants  
    1                       4  
    2                       6  
    3                       8  
    4                       9  
    

    【讨论】:

    • 这两个选项似乎都有效。尤其是第二个很有趣。我不知道有可能这样做。非常感谢!
    猜你喜欢
    • 2022-01-01
    • 2020-10-26
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 2022-07-26
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多