【问题标题】:How to replace a column using pandas with the matching value from another file?如何使用来自另一个文件的匹配值替换使用熊猫的列?
【发布时间】: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_onright_on 参数,就像我添加的参考文献中一样?如果你的意思是“列内容不匹配”没有唯一的键可以合并,听起来你不能手工完成,那么你怎么能指望python来做呢?
  • @Aryerez 我明白你的意思。但还有另一个包含匹配信息的单独文件。我怎样才能将它与现有的 3 张纸结合起来并制作一个主列表,这是我最初的问题.. 有道理吗?
  • @Ratha:你知道吗,只需将你的映射信息 df 与第一个 df 合并。然后,您的第一个 df 将具有站点和 deliveryID 信息。然后,您可以再次使用相同的合并功能来合并所有三个工作表。这很容易实现。你需要这个代码吗?

标签: python python-3.x pandas pandas-groupby


【解决方案1】:

您想合并 3 张工作表,您只需要合并而不是 groupby。

您可以尝试以下示例代码,如果有帮助,请告诉我。

df
Out[29]: 
  ship-to party Sitename  Deliveryid
1          PQ01    SiteA    543892.0
2          PQXY    SiteB    539081.0

df1
Out[30]: 
        Date Ship-to-party  Volume
0  1/09/2019          PQ01  1000.0
1  2/09/2019          PQXC  2500.0

df1=df1.merge(df,left_on='Ship-to-party',right_on='ship-to party')

df1
Out[32]: 
        Date Ship-to-party    ...      Sitename Deliveryid
0  1/09/2019          PQ01    ...         SiteA   543892.0

[1 rows x 6 columns]
df1.columns=['Date', 'Ship-to-party', 'Volume', 'ship-to party', 'Site',
       'Deliveryid']

现在将 df1 与其他工作表合并。

df1.merge(df2,on='Site').merge(df3,on='Deliveryid')

【讨论】:

  • 谢谢 Hue..你可以看到我原来的问题我如何尝试合并..但是为什么那个 group by 可以按预期工作?
  • 什么是 atg_aggregation?和group-by,你能解释一下你在这里做什么吗?您要对哪些列进行分组以及您想要什么聚合函数?
  • 聚合只是根据日期列计算记录。使用 groupby,尝试每天/每个站点/每个罐或产品分组什么是销售价值,交付价值下降价值..我上面的代码在合并时看起来没问题?
  • 看起来不太好。但我们可以为您提供帮助,前提是您向我们提供合并输出的样例以及您希望在 groupby 之后看到的输出。
  • 我用我的输出必须如何编辑我的问题..基本上在所有 3 张纸中挑选几列并制作最后一张..对不起,我对 python/panda 完全陌生
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 2018-07-14
  • 2021-08-31
  • 2019-04-22
  • 2019-01-02
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
相关资源
最近更新 更多