Python Pandas 将 Header 替换为顶行
Python Pandas Replacing Header with Top Row
我目前有一个如下所示的数据框:
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
我正在寻找一种方法来删除 header 行并使第一行成为新的 header 行,因此新数据框将如下所示:
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:
的方法,然后在没有 header df.to_csv(newformat,header=False,index=False)
的情况下制作数据框,但我似乎没有任何进展。
只需执行以下操作即可更改数据框
df.columns = df.iloc[0]
df = df[1:]
然后
df.to_csv(path, index=False)
应该可以解决问题。
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
如果你想要一条线,你可以这样做:
df.rename(columns=df.iloc[0]).drop(df.index[0])
@ostrokach 的回答是最好的。您很可能希望在对数据框的任何引用中都保留它,因此将从 inplace = True 中受益。
df.rename(columns=df.iloc[0], inplace = True)
df.drop([0], inplace = True)
--另一种方法
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
如果你喜欢它,请点击向上箭头。谢谢
这是定义列索引的简单技巧 "in place"。因为 set_index
设置 row 索引,我们可以通过转置数据框、设置索引并将其转回来对列做同样的事情:
df = df.T.set_index(0).T
请注意,如果您的行已经有不同的索引,您可能需要更改 set_index(0)
中的 0
。
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
最佳实践和最佳OneLiner:
df.to_csv(newformat,header=1)
注意 header 值:
Header 引用用作列名的行号。别搞错了,行号不是 df,而是来自 excel 文件(0 是第一行,1 是第二行,依此类推)。
这样,您将获得所需的列名,而无需编写额外的代码或创建新的 df。
好消息是,它删除了被替换的行。
另一个 one-liner 使用 Python 交换:
df, df.columns = df[1:] , df.iloc[0]
这不会重置索引
不过,相反的方法不会像预期的那样工作df.columns, df = df.iloc[0], df[1:]
或者,我们可以在使用 pandas 读取文件时执行此操作。
这个案例我们可以用,
pd.read_csv('file_path',skiprows=1)
读取文件时,这将跳过第一行并将该列设置为文件的第二行。
我目前有一个如下所示的数据框:
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
我正在寻找一种方法来删除 header 行并使第一行成为新的 header 行,因此新数据框将如下所示:
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:
的方法,然后在没有 header df.to_csv(newformat,header=False,index=False)
的情况下制作数据框,但我似乎没有任何进展。
只需执行以下操作即可更改数据框
df.columns = df.iloc[0]
df = df[1:]
然后
df.to_csv(path, index=False)
应该可以解决问题。
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
如果你想要一条线,你可以这样做:
df.rename(columns=df.iloc[0]).drop(df.index[0])
@ostrokach 的回答是最好的。您很可能希望在对数据框的任何引用中都保留它,因此将从 inplace = True 中受益。
df.rename(columns=df.iloc[0], inplace = True)
df.drop([0], inplace = True)
--另一种方法
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
如果你喜欢它,请点击向上箭头。谢谢
这是定义列索引的简单技巧 "in place"。因为 set_index
设置 row 索引,我们可以通过转置数据框、设置索引并将其转回来对列做同样的事情:
df = df.T.set_index(0).T
请注意,如果您的行已经有不同的索引,您可能需要更改 set_index(0)
中的 0
。
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
最佳实践和最佳OneLiner:
df.to_csv(newformat,header=1)
注意 header 值:
Header 引用用作列名的行号。别搞错了,行号不是 df,而是来自 excel 文件(0 是第一行,1 是第二行,依此类推)。
这样,您将获得所需的列名,而无需编写额外的代码或创建新的 df。
好消息是,它删除了被替换的行。
另一个 one-liner 使用 Python 交换:
df, df.columns = df[1:] , df.iloc[0]
这不会重置索引
不过,相反的方法不会像预期的那样工作df.columns, df = df.iloc[0], df[1:]
或者,我们可以在使用 pandas 读取文件时执行此操作。
这个案例我们可以用,
pd.read_csv('file_path',skiprows=1)
读取文件时,这将跳过第一行并将该列设置为文件的第二行。