Python Pandas 用顶行替换标题

Posted

技术标签:

【中文标题】Python Pandas 用顶行替换标题【英文标题】:Python Pandas Replacing Header with Top Row 【发布时间】: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) 的数据框,但我似乎没有得到任何结果。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Python Pandas 用顶行替换标题的主要内容,如果未能解决你的问题,请参考以下文章

Python - Pandas - 用正则表达式替换字符串| (要么)

python pandas用数字替换数据框中的字符串

Python Pandas:使用正则表达式用超链接替换字符串

Python Pandas Dataframe 用同一会话的另一个单元格的值替换单元格值

将文本传输到 txt 的顶行 - python [重复]

Python Pandas:如何替换包含“?”的字符串