如何在我的数据框中添加一列,说明每行来自哪个工作表名称? Python

Posted

技术标签:

【中文标题】如何在我的数据框中添加一列,说明每行来自哪个工作表名称? Python【英文标题】:How do I add a column to my dataframe that says what sheet name each row is from? Python 【发布时间】:2020-04-07 06:28:05 【问题描述】:

我正在使用一个有五张纸的数据框,我想使用其中四张。所以我可以加载它:

df = pd.read_excel('***.xls', sheet_name=['a', 'b', 'c', 'd'])

但现在我想添加一列,说明每行所在的工作表,但我不知道该怎么做。我试过这样的事情

for name, frame in df.items():
        frame['Sheet'] = name
        df = df.append(frame, ignore_index=True)

但我收到以下错误:

AttributeError: 'collections.OrderedDict' 对象没有属性 'append'

任何帮助将不胜感激。先感谢您!

假设这是我连接工作表后的数据:

df = pd.concat(pd.read_excel(***.xls, sheet_name=['a', 'b', 'c', 'd'],
                          header=1), ignore_index=True, sort=False)

Concat data

我的目标是添加一列,说明每行来自哪个工作表,就像这样...

Concat data with sheet name row

希望这可以帮助您了解我的目标。

(编辑)如果我想使用数据框中的所有工作表,但不想列出每个工作表的单独名称,我也想知道如何执行此操作。谢谢!

【问题讨论】:

请分享您的数据示例和您期望的输出。 【参考方案1】:

IIUC,在list comprehension 中尝试DataFrame.assign

sheets = ['a', 'b', 'c', 'd']

df = pd.concat([pd.read_excel('***.xls', sheet_name=s)
                .assign(sheet_name=s) for s in sheets])

更新

如果您想使用所有工作表并指定一列工作表名称,您可以这样做:

workbook = pd.ExcelFile('***.xls')
sheets = workbook.sheet_names

df = pd.concat([pd.read_excel(workbook, sheet_name=s)
                .assign(sheet_name=s) for s in sheets])

【讨论】:

如果我想通过说 sheet_name = None 来使用文件中的所有工作表,我能做这样的事情吗?我也希望能够做到这一点,而不必列出工作表名称。 @jpk 是的,检查更新的答案以了解一种可能的方法 感谢您的更新!我刚刚得出了同样的结论,很高兴看到我在同一页上。【参考方案2】:

如果您在read_excel 方法中指定sheet_name,您将返回一个ordered_dict 类型的对象。而ordered_dict对象没有append功能。你可以试试这个,

import pandas as pd

data = pd.read_excel('***.xls', sheet_name=['a', 'b', 'c', 'd'])

df = pd.DataFrame()

for name, frame in data.items():
    frame['sheet'] = name
    df = df.append(frame)

print(df)

【讨论】:

感谢您的帮助!这也适用于我,我真的很喜欢其他解决方案的简洁性。

以上是关于如何在我的数据框中添加一列,说明每行来自哪个工作表名称? Python的主要内容,如果未能解决你的问题,请参考以下文章

如何从不同的数据框中添加一列:Scala Frame

如何在特定小时的滚动平均值的熊猫数据框中添加一列

如何在 Spark 数据框中添加具有当前日期的额外列

Flyway-在名称中包含指定后缀的所有表中添加一列

在SQL数据库表中添加一列数值型(默认保留2位)的数字,该怎么写?

Prisma:如何在查询返回中添加一列?