【问题标题】:Aggregate based on each item in a special character seperated column in Pandas根据 Pandas 中特殊字符分隔列中的每个项目进行聚合
【发布时间】:2018-09-06 08:40:31
【问题描述】:

我输入了如下数据

日期 投资类型 中 2000 年 1 月 1 日 共同基金、股票、定期存款、房地产自有、在线、通过代理 2000 年 1 月 2 日 共同基金、股票、房地产 1/3/2000 网上定期存款 2000 年 1 月 3 日 互惠基金、定期存款、代理不动产 2000 年 1 月 2 日拥有、在线、通过代理的股票

我的函数的输入是中等。它可以是列表的单个值。我想根据 Medium 输入搜索数据,然后汇总数据,如下所示。对于 Medium 中的值,请查看投资类型,然后汇总每种投资类型的数据

中等投资类型日期 拥有,在线共同基金 2000 年 1 月 1 日,2000 年 1 月 2 日 拥有,在线股票 1/1/2000,1/2/2000 拥有,在线定期存款 2000 年 1 月 1 日,2000 年 1 月 3 日 拥有,在线房地产 1/1/2000

【问题讨论】:

    标签: python pandas csv aggregate


    【解决方案1】:

    你可以使用:

    L = ['Online','Own']
    pat = '|'.join(r"\b{}\b".format(x) for x in L)
    df['New_Medium'] = df.pop('Medium').str.findall('('+ pat + ')').str.join(', ')
    #remove rows with empty values
    df = df[df['New_Medium'].astype(bool)]
    

    from  itertools import product
    df1 = pd.DataFrame([j for i in df.apply(lambda x: x.str.split(',\s*')).values 
                          for j in product(*i)], columns=df.columns)
    print (df1)
            Date Investment Type New_Medium
    0   1/1/2000     Mutual Fund        Own
    1   1/1/2000     Mutual Fund     Online
    2   1/1/2000          Stocks        Own
    3   1/1/2000          Stocks     Online
    4   1/1/2000   Fixed Deposit        Own
    5   1/1/2000   Fixed Deposit     Online
    6   1/1/2000     Real Estate        Own
    7   1/1/2000     Real Estate     Online
    8   1/2/2000     Mutual Fund        Own
    9   1/2/2000          Stocks        Own
    10  1/2/2000     Real Estate        Own
    11  1/3/2000   Fixed Deposit     Online
    12  1/2/2000          Stocks        Own
    13  1/2/2000          Stocks     Online
    

    #get all combinations and aggregate join by unique values
    df = df1.groupby('Investment Type').agg(lambda x: ', '.join(x.unique())).reset_index()
    print (df)
      Investment Type                Date   New_Medium
    0   Fixed Deposit  1/1/2000, 1/3/2000  Own, Online
    1     Mutual Fund  1/1/2000, 1/2/2000  Own, Online
    2     Real Estate  1/1/2000, 1/2/2000  Own, Online
    3          Stocks  1/1/2000, 1/2/2000  Own, Online
    

    【讨论】:

    • 这个解决方案效果很好...我是 Pandas 和 Python 的新手,所以感谢您的耐心和指导。
    • 通过使用pop我们取出了原来的medium栏,有什么办法可以保留吗?我想在聚合结果中显示原始媒体列和新媒体列
    • 你可以使用df.pop('Medium')df['Medium']
    • 嗨@Jezrael,我遇到了空间问题,使用您对使用笛卡尔积的建议。列数已添加到输入中,因此笛卡尔积的输出是压倒性的。您还有其他推荐的解决方案吗?谢谢
    • 好的,我正在使用循环。如果可行,我将在此处发布解决方案。感谢您的帮助。
    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 2015-02-07
    • 2023-01-05
    • 1970-01-01
    相关资源
    最近更新 更多