如何根据 PANDAS 中的 groupby 字段在 for 循环中写入 to_excel 动态文件名?

How to write to_excel dynamic filename in for loop based on groupby field in PANDAS?

我有每个州学校的数据集。我想按州对学校进行分组,运行 进行一些计算以创建 运行king,然后将每个 运行king 导出到名为 "state.xlsx" 的单独 .xlsx 文件。比如AK学校数据变成ranking_alaska.xlsx,TX学校数据变成ranking_texas.xlsx,等等

此处的示例数据:https://docs.google.com/spreadsheets/d/1-wdmIz_-AILcBqzvpwAFGZfXqhq8oDRrYFVVdkjZ10o/edit?usp=sharing

我试过将状态字段连接到文件名上,但出现类型错误:只能将 str(不是 "tuple")连接到 str。当我 运行 具有静态文件名的代码时,它会为第一行数据中的状态创建一个文件。


df = pd.read_excel("ranker_test.xlsx", sheet_name='DATA')

grouped = df.groupby('state')

for x in grouped:
    df.to_excel('test files/ranking_' + x + '.xlsx', index=False)

我想将其余代码添加到 for 循环中并使文件名动态化,以便在 运行 时生成 50 个状态 运行king excel 文件, 每个都以各自的州命名。

编辑: 我使用 Reedinator 的输入来创建文件名,但无法将每个组导出到 excel。它要么 returns 所有组的整个数据帧到每个文件,要么无法执行。这是我的代码:

for group in grouped:
    group.to_frame().to_excel('test files/ranking_{}.xlsx'.format(group[0]), index=False)

但是我得到 AttributeError: 'tuple' object has no attribute 'to_frame'

如何将元组转换为 DataFrame 以发送到 excel?

这个错误告诉你一个非常简单的解释为什么它不起作用 -> x 是一个 元组 不是一个字符串!我个人会尝试打印它并验证它确实是我想要的:

for x in grouped:
    print(x)

这将向您显示 (item0, item1, item2, ..., itemN)

现在您可以 select 哪一项是您要查找的字符串,例如:

for x in grouped:
    df.to_excel('test files/ranking_{}.xlsx'.format(x[0]), index=False)

其中 x[0] 会告诉它获取 item0(理想情况下是一个字符串,但您也可以将其转换为一个,如下所示)。或者,您可以创建一个文件名,例如 test files/ranking_(item0, item1, item2, ..., itemN).xlsx(使用元组的字符串表示形式),例如:

for x in grouped:
    df.to_excel('test files/ranking_{}.xlsx'.format(x), index=False)

应该注意 .format() 方法在需要时隐式调用 str() 函数(因为 .format() is different than concatenation and is usually a lot cleaner to read, faster to run, and just generally better 不是连接)。如果你真的想使用连接,你只需要自己把它变成一个字符串:

for x in grouped:
    df.to_excel('test files/ranking_' + str(x) + '.xlsx', index=False)

但是,请过渡到 .format()!!如果你有更新版本的 python 你甚至可以跳到最新最好的 f strings

看来你也应该复习一下 pandas groupby function

他们的例子让我相信你需要:

for name, group in grouped:
    group.to_excel('test files/ranking_{}.xlsx'.format(name), index=False)

但是,我不是 pandas 专家,也没有测试过它是否准确。