【问题标题】:Create a while loop to concat columns from weekly excel files in pandas创建一个while循环来连接熊猫每周excel文件中的列
【发布时间】:2019-12-04 18:32:58
【问题描述】:

我有 3 年的 excel 每周文件,格式为“2018-01-01 至 2018-01-07.xlsx 的卡车”、“2018-01-08 至 2018-01-14.xlsx 的卡车”和很快。我需要从每个文件中提取 4 个包含总计的单元格,并构建一个数据框,其中包含每周值在右侧添加列的值。

我尝试了一个 while 循环来清理循环中的每个 excel,但不知何故,我遇到了初学者问题,需要在数据框的右侧附加一个新列。

预期结果将是包含以下数据的 Dataframe: 列:第 1 周、第 2 周...第 N 周(或开始日期) 行:Dock 1、Dock2、Dock 3、Dock 4

[编辑] 我得到的结果是 Dock 1、Dock 2、Dock 3、Dock 4 的索引是正确的。 在那之后,两列都包含最后一个文件中的值。

import pandas as pd
from datetime import date, timedelta

start_date = date(2018, 1, 1)
end_date1 = date(2018, 1, 7)
end_date = date(2018, 1, 14)
delta = timedelta(days=7)

while start_date <= end_date:
    tr = pd.read_excel('trucks from {} to {}.xlsx'.format(start_date, end_date1))

    # I clean up the columns
    tr = tr.drop('Unnamed: 0', 1)
    tr = tr.drop('Unnamed: 1', 1)
    tr = tr.drop('Unnamed: 2', 1)

    # I clean up the rows
    tr = tr.drop(tr.loc[:, 'Unnamed: 4':'Unnamed: 29'].head(0).columns, axis=1)
    tr = tr.loc[[34, 51, 58, 66], :]

    # I rename the rows of interest
    tr = tr.rename(index={34: 'Dock 1', 51: 'Dock 2', 58: 'Dock 3', 66: 'Dock 4'})

    # Closing the loop and adding a new column at the end
    tr[start_date] = tr
    tr.append(tr)
    start_date += delta
    end_date1 += delta

【问题讨论】:

  • 你现在得到的结果是什么?
  • 感谢您的提示,第一次发帖,我添加了一个编辑。

标签: python pandas loops append concat


【解决方案1】:

我认为问题之一是您在每一步都重新分配tr。在 while 指令下,您首先分配tr,如下所示:

tr = pd.read_excel('trucks from {} to {}.xlsx'.format(start_date, end_date1))

所以tr 是一个很好的DataFrame,因为这是您想要的,您希望DataFrame 对其执行一些操作。

但是在你的循环结束时你会这样做:

# Closing the loop and adding a new column at the end
    tr[start_date] = tr
    tr.append(tr)
    start_date += delta
    end_date1 += delta

您的第一行分配给列start_date 您当前的DataFrame,我认为这很奇怪,我不确定这是您想要做的。 然后你append你的DataFrame你自己的DataFrame。在循环的下一步,你将失去你所拥有的,因为你重新分配了tr

尝试创建一个 DataFrame,其中包含您将获取的每个 DataFrame(每个 tr 您构造)。您可以像以前一样使用apppend 函数或concat 函数。

【讨论】:

  • 谢谢你,你是对的,最后两行有问题,仍然找不到解决方法。
  • 错误的是,你不应该在循环的每一步都附加到tr,而是有一个df DataFrame,你可以将tr的内容附加到你的每一步完成处理后循环。否则,因为您在循环的每一步都重新分配 tr 内容,您会丢失前面步骤的内容。
【解决方案2】:

花了我 1 个月的时间来破解这个问题,所以我将分享这个问题的解决方案。我必须创建一个新的数据框并将其自身连接到 tr,如下所示:

# Transpose in order to have the data in columns
tr = tr.transpose()

# I created a new dataframe to store the data
result = pd.concat([result, tr], sort=False)

# I close the loop adding 7 days in order to store weekly data
start_date += delta
end_date1 += delta

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2020-12-23
    • 1970-01-01
    • 2022-10-24
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多