【问题标题】:Python: How do I 'demote' a column header to be a row and rename column headers (without replacing the original column headers)?Python:如何将列标题“降级”为行并重命名列标题(不替换原始列标题)?
【发布时间】:2021-07-08 23:47:23
【问题描述】:

我有一个这样的数据框:

如您所见,列标题“艺术与社会科学 1、470、905、1375”本身应该是一行,我想设置更合适的列标题,例如“课程、男性、女性、总计” .

本质上,我想将我当前的列标题作为一行数据向下“推送”,并设置新的列标题。 我该怎么做?

我希望我的数据框看起来像这样:

Faculty Male Female Total
Arts & Social Sciences 1 470 905 1375
Arts & Social Sciences 2 438 1085 1523

...等等

---编辑---

感谢您的回复! 我应该提供更多信息并声明我不是在使用 pandas 时读取此数据帧,而是使用带有 tabula.read_pdf() 函数的tabula 库从 PDF 中读取它,并且数据帧像这样出现.有什么想法吗?

【问题讨论】:

  • 当您将帧集标题读取为无时:df = pd.read_csv(file.csv, header=None) 然后分配新列:df.columns = ['Faculty', 'Male', . . .]
  • 你是如何读取这个数据框的?您可能需要提供列名。如果是pd.read_csv(..., names=["Faculty", "Male", "Female", "Total"]) 应该可以工作
  • ---编辑--- 感谢您的回复!我应该提供更多信息并声明我不是在使用 pandas 时读取此数据帧,而是使用带有 tabula.read_pdf() 函数的 tabula 库从 PDF 中读取它,并且数据帧像这样出现。有什么想法吗?
  • @BernardC 在tabula docs 中声明如果您阅读单个表格,则可以使用pandas_options={"names": ["Faculty", "Male", "Female", "Total"])}

标签: python pandas dataframe


【解决方案1】:

如果重新读取数据为时已晚,您可以将列的值和当前值堆叠在一起,并使用传递的列名生成一个新的数据框:

import numpy as np

all_values = np.row_stack((df.columns, df.to_numpy()))
new_df = pd.DataFrame(all_values, columns=["Faculty", "Male", "Female", "Total"])

tabula.read_pdf 似乎也支持 pandas 选项,所以:

col_names = ["Faculty", "Male", "Female", "Total"]
tabula.read_pdf(path,
                pandas_options=dict(header=None, names=col_names))

【讨论】:

  • 谢谢!这真的很有用,但不幸的是,PDF 中的表格被不一致地读取为 4 和 5 列。不是最好的,但我可以使用它!
【解决方案2】:

正如评论中提到的,如果你正在阅读CSV文件,你可以传递列名:

df = pd.read_csv(filePath, names=["Faculty", "Male", "Female", "Total"])

但是如果你已经有了dataframe,你可以在-1处添加列索引,然后你可以重置索引,如果需要也可以对索引进行排序。:

df.loc[-1] = df.columns.to_list() 
df = df.sort_index().reset_index(drop=True)
df.columns = ['Faculty', 'Male', 'Female', 'Totals']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2018-12-26
    相关资源
    最近更新 更多