Python Pandas用顶部行替换标题


79

我目前有一个数据框,看起来像这样:

           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)但是我似乎什么也没得到。

Answers:


142
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

44

只需执行以下操作即可更改数据框

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

然后

df.to_csv(path, index=False) 

应该做到的。


3
这是一个更好的答案,因为其中没有多余的代码(new_header)。
Ad Infinitum

30

如果您需要单线,则可以执行以下操作:

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

3

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


2

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

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

请注意0set_index(0)如果您的行已经具有其他索引,则可能必须更改in 。


1

另一种使用Python交换的代码:

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

这不会重置索引

虽然,相反情况无法按预期工作 df.columns, df = df.iloc[0], df[1:]


0

-另一种方法


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

如果您喜欢它,请按向上箭头。谢谢



0

最佳实践和最佳OneLiner

df.to_csv(newformat,header=1)

注意标题值:

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

这样,您将获得所需的列名,而不必编写其他代码或创建新的df。

好东西是,它删除了替换的行。


虽然这只是输出CSV,但它不会更改数据框,对吗?
AMC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.