创建一个 while 循环以连接 pandas 中每周 excel 个文件的列
Create a while loop to concat columns from weekly excel files in pandas
我有 3 年的 excel 每周文件,格式为 "trucks from 2018-01-01 to 2018-01-07.xlsx"、"trucks from 2018-01-08 to 2018-01-14.xlsx" 等等。我需要从每个文件中提取 4 个包含总计的单元格,并构建一个数据框,每周值将列添加到右侧的值。
我尝试了一个 while 循环来清理循环中的每个 excel 但不知何故我遇到了初学者问题,无法将新列附加到数据框的右侧。
预期结果将是包含以下数据的数据框:
列:第 1 周、第 2 周...第 N 周(或开始日期)
行数:码头 1、码头 2、码头 3、码头 4
[编辑]
我得到的结果是 Dock 1、Dock 2、Dock 3、Dock 4 的索引是正确的。
在这 2 列之后,两列中都有来自最后一个文件的值。
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
我认为问题之一是您重新分配 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
您的第一行将您当前的 DataFrame 分配给 start_date
列,我认为这很奇怪,我不确定这是您想要做的。
然后你 append 到你的 DataFrame 你自己的 DataFrame。在循环的下一步,你将失去你所拥有的,因为你重新分配 tr
.
尝试创建一个 DataFrame 来保存您将获取的每个 DataFrame(您构建的每个 tr
)。您可以使用 apppend function as you already did or the concat 函数。
我花了 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
我有 3 年的 excel 每周文件,格式为 "trucks from 2018-01-01 to 2018-01-07.xlsx"、"trucks from 2018-01-08 to 2018-01-14.xlsx" 等等。我需要从每个文件中提取 4 个包含总计的单元格,并构建一个数据框,每周值将列添加到右侧的值。
我尝试了一个 while 循环来清理循环中的每个 excel 但不知何故我遇到了初学者问题,无法将新列附加到数据框的右侧。
预期结果将是包含以下数据的数据框: 列:第 1 周、第 2 周...第 N 周(或开始日期) 行数:码头 1、码头 2、码头 3、码头 4
[编辑] 我得到的结果是 Dock 1、Dock 2、Dock 3、Dock 4 的索引是正确的。 在这 2 列之后,两列中都有来自最后一个文件的值。
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
我认为问题之一是您重新分配 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
您的第一行将您当前的 DataFrame 分配给 start_date
列,我认为这很奇怪,我不确定这是您想要做的。
然后你 append 到你的 DataFrame 你自己的 DataFrame。在循环的下一步,你将失去你所拥有的,因为你重新分配 tr
.
尝试创建一个 DataFrame 来保存您将获取的每个 DataFrame(您构建的每个 tr
)。您可以使用 apppend function as you already did or the concat 函数。
我花了 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