【发布时间】:2020-01-24 02:41:29
【问题描述】:
我有一个包含以下列的 Excel 表格。
Date, Ship-to-party ,Volume
1/09/2019 PQ01 1000
2/09/2019 PQXC 2500
...
另一张是这样的;
Document Date Deliveryid Sales
01/09/2019 153678 350
01/09/2019 236742 400
另一张是这样的;
Time Site Dips
01/09/2019 SiteA 1500
01/09/2019 SiteB 1222
...
在另一个 excel/csv 文件中,我已经定义了收货方的含义。 也就是说,我最初有 3 个不同的工作表,每个工作表都包含不同名称的列(例如:站点名称)。 (例如:送货方、站点名称、交货 ID) 我的要求是根据日期和站点名称以及其他值将所有 3 个工作表组合在一个工作表中。 为此,我有一张单独的表格,其中包含ship-to-party value=Sitename=Deliveryid (有3列)
如何根据单个站点名称替换原来的 3 个工作表列,并使用 pandas 将它们组合以获得单个 Excel 工作表?
我的映射表包含
ship-to party Sitename Deliveryid
PQ01 SiteA 543892
PQXY SiteB 539081
....
我希望我的最后一张纸是这样的
Date Sitename Sales Dips Volume
1/09/2019 SiteA 500 1000 1500
1/09/2019 SiteB 100 500 2000
....
我尝试像 Hue 提到的那样;
def write_dips(writer):
file_path = '/Users/ratha/PycharmProjects/DataLoader/output.xlsx'
mappingfilepath ='/Users/ratha/PycharmProjects/DataLoader/data/mappings/File Mapping.csv'
df_dips = pd.read_excel(file_path, sheet_name='DipsSummary')
df_sales = pd.read_excel(file_path, sheet_name='SaleSummary')
df_delivery = pd.read_excel(file_path, sheet_name='DeliverySummary')
df_mapping = pd.read_csv(mappingfilepath, delimiter=',', skiprows=[1])
df2 = df_dips.merge(df_mapping, left_on='Site',right_on='SHIP TO NAME').\
merge(df_sales,left_on ='Delivery ID',right_on='Deliveryid').\
merge(df_delivery, left_on='SHIP-TO PARTY',right_on='Ship-To Party')
print(df2.dtypes) <--this prints all columns..so merging works
x = df2.groupby(['Dip Time', 'Site', 'Tank ID', 'Product', 'Volume',
'IdassId', 'TankNo', 'GradeNo','Sales','Ship-To Party', 'Material','Qty in Stock UoM'], as_index=False).apply(atg_aggregation)
x.to_excel(writer, sheet_name='DipsNewSummary')
但最终输出文件不包含任何内容。我尝试的 groupby 是正确的(我对所有 3 张表中的所有列都使用 group by?
合并后,我希望我的工作表应该是这样的; (我希望在所有 3 张纸中选择几列,因此在 groupby 方法中应用所有列)
Dip Time Site Tank ID Product Dips DeliveryId Sales Ship-To Party
1/09/2019 SiteA 1 Diesel 500 526781 150 PQ01
【问题讨论】:
-
@Aryerez 这里的问题是使用 merge() 函数,我的列名不匹配。还有专栏内容。请检查我上面的示例,我提供了 3 张纸。(送货方、交货 ID、站点所有 3 列表示一个。映射信息在另一个文件中)
-
您是否尝试过使用
merge函数的left_on、right_on参数,就像我添加的参考文献中一样?如果你的意思是“列内容不匹配”没有唯一的键可以合并,听起来你不能手工完成,那么你怎么能指望python来做呢? -
@Aryerez 我明白你的意思。但还有另一个包含匹配信息的单独文件。我怎样才能将它与现有的 3 张纸结合起来并制作一个主列表,这是我最初的问题.. 有道理吗?
-
@Ratha:你知道吗,只需将你的映射信息 df 与第一个 df 合并。然后,您的第一个 df 将具有站点和 deliveryID 信息。然后,您可以再次使用相同的合并功能来合并所有三个工作表。这很容易实现。你需要这个代码吗?
标签: python python-3.x pandas pandas-groupby