在Pandas数据框中,将列标题转换为第一行,将行标题转换为第一列。

4

我有一个类似于以下的数据框:

123  345   456   789
987  876   765   543
...  ...   ...   ...

但是顶部行和最左侧列被视为标题,实际上它们是值。有没有办法将它们向下/向右移动并用默认索引替换它们?
编辑:我已经考虑过设置header=None,但这不是一个选项。数据框是通过read_excel创建的,但程序的许多部分已经使用了.loc等直接引用要删除的标题名称。

这个数据框是怎么以这种明显错误的方式创建的呢?你是不是把数据导入到数据框中了?你对它的创建有影响吗?没有标题的数据应该在被放入数据框中时就被视为这样。 - SpghttCd
当读取文件 pd.read_csv(..., header=None) 时,应该解决这个问题。 话虽如此,重置 index 很容易 df.reset_index()。 列有点烦人 df.T.reset_index().T。 但是如果你真的需要两者,那么你需要解决结果的第一个位置放什么值的问题。 意思是,数据框左上角将没有值。 我认为你需要一个 [mcve]。 - piRSquared
4个回答

9

针对您的解决方案,只需移动它即可。但如果您正在从任何csv文件中读取数据,则在读取时可以考虑不获取标题(header=None)。

    345 456 789
123         
987 876 765 543

df.reset_index().T.reset_index().T

输出:

         0  1   2   3
index   123 345 456 789
0       987 876 765 543


pd.read_csv('data.csv',header=None)

输出:

    0   1   2   3
0   123 345 456 789
1   987 876 765 543

2

使用参数index_col=[0],默认情况下第一行将被转换为列名,因此不需要该参数:

import pandas as pd

temp=u"""123;345;456;789
987;876;765;543"""
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv'
df = pd.read_csv(pd.compat.StringIO(temp), sep=";", index_col=[0])

print (df)
     345  456  789
123               
987  876  765  543

如果输入数据是没有标题的DataFrame:
print (df)
     0    1    2    3
0  123  345  456  789
1  987  876  765  543

#set first row to columns
df.columns = df.iloc[0]
#remove first row from data and remove columns name
df = df.iloc[1:].rename_axis(None, axis=1)
#set index by first column
df = df.set_index(df.columns[0])
print (df)
     345  456  789
123               
987  876  765  543

如果数据中可能出现相同类型的值,可以使用 numpy 进行索引:
arr = df.values
df = pd.DataFrame(arr[1:,1:], index=arr[1:,0], columns=arr[0,1:])
df.index.name = arr[0,0]
print (df)
     345  456  789
123               
987  876  765  543

0

创建数据框架时似乎出现了问题。数据框架是如何创建的?您很可能可以通过正确的创建来解决问题。

如果这不是一个选项,请尝试以下操作: pandas.DataFrame.reset_index() 是您想要的。至于列名,只需使用 pandas.DataFrame.append() 将它们作为常规行添加,并使用 df.columns 作为参数(其中 df 是您的数据框架),然后重命名列。


0
如何在原始DataFrame中就地插入一行到顶部
import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})  # Sample DataFrame


new_row = {'A': 7, 'B': 8} # Create a new row as a dictionary
df.loc[-1] = new_row  # Append row to the bottom with index=-1

df.index = df.index + 1  # Shift df index by 1 to maintain index continuity
df.sort_index(inplace=True)  # Sort by index to ensure the new row at the top

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接