使用Pandas组合第一行和标题

2024-09-26 18:13:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在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列开始的标题,以便它成为:

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

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


Tags: columns数据projectclean标题numbernewindex
1条回答
网友
1楼 · 发布于 2024-09-26 18:13:05

转换前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:]])

Anf然后:

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

如果可能,通过^{}中的参数header=[0,1]通过前两行创建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  

相关问题 更多 >

    热门问题