Python 以特殊字符分隔列中的每个项目为基础的聚合

Python 以特殊字符分隔列中的每个项目为基础的聚合,python,pandas,csv,aggregate,Python,Pandas,Csv,Aggregate,我有如下所示的输入数据 Date Investment Type Medium 1/1/2000 Mutual Fund, Stocks, Fixed Deposit, Real Estate Own, Online,Through Agent 1/2/2000 Mutual Fund, Stocks, Real Estate Own 1/3/2000

我有如下所示的输入数据

Date Investment Type Medium 1/1/2000 Mutual Fund, Stocks, Fixed Deposit, Real Estate Own, Online,Through Agent 1/2/2000 Mutual Fund, Stocks, Real Estate Own 1/3/2000 Fixed Deposit Online 1/3/2000 Mutual Fund, Fixed Deposit, Real Estate Through Agent 1/2/2000 Stocks Own, Online, Through Agent 日期投资型媒体 2000年1月1日共同基金、股票、定期存款、自有房地产、在线、通过代理 2000年1月2日共同基金、股票、房地产 2000年1月3日网上定期存款 2000年1月3日共同基金、定期存款、代理房地产 2000年1月2日通过代理在线持有股票 我的函数的输入是中等的。它可以是列表的单个值。我想根据媒体输入搜索数据,然后按如下所示聚合数据。对于中间值,请检查投资类型,然后汇总每种投资类型的数据

Medium Investment Type Date Own,Online Mutual Fund 1/1/2000,1/2/2000 Own,Online Stocks 1/1/2000,1/2/2000 Own,Online Fixed Deposit 1/1/2000,1/3/2000 Own,Online Real Estate 1/1/2000 中等投资类型日期 Own,在线共同基金2000年1月1日,2000年1月2日 Own,在线股票2000年1月1日,2000年1月2日 自有,网上定期存款2000年1月1日,2000年1月3日 Own,在线房地产2000年1月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)]



这个解决方案效果很好…我对Pandas和Python还不熟悉,所以感谢您的耐心和指导。通过使用pop,我们删除了原来的中栏,有什么方法可以保留它吗?我想在聚合结果中显示原始的中间列和新的中间列。您可以使用
df.pop('medium')
df['medium']
Hi@Jezrael,使用您推荐的笛卡尔积,我遇到了空间问题。列的数量已经添加到输入中,因此笛卡尔积的输出是压倒性的。您还有其他的解决方案吗?谢谢,我正在研究使用循环。如果可行,我将在这里发布解决方案。谢谢你的帮助。
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