替代递归sql /重复数据删除列

时间:2015-07-17 22:08:07

标签: sql pandas

嗨,我有data set一对多的关系。我想将concatenating每列的不同值

降低到1-1

以下是一个例子:

我有一个名为CustomerProduct Affiliation (PA)的数据集。一个customer可以multiple PA有不同的时间。

这是输入:

╔════════╦═══════╦══════╦══════╗
║ Cust   ║PA1    ║ PA2  ║ PA3  ║
╠════════╬═══════╬══════╬══════╣
║ A      ║ H     ║ M    ║ L    ║
║ A      ║ H     ║ L    ║ M    ║
║ A      ║ H     ║ M    ║ H    ║
╚════════╩═══════╩══════╩══════╝

期望的输出:

╔════════╦══════╦══════════╦═══════╗
║  Cust  ║  PA1 ║   PA2    ║  PA3  ║
╠════════╬══════╬══════════╬═══════╣
║  A     ║  H   ║   M&L    ║ L&M&H ║
╚════════╩══════╩══════════╩═══════╝

我有多个PA列。我想知道是否有可以应用的通用蟒蛇熊猫代码 谢谢 明克

1 个答案:

答案 0 :(得分:0)

以下是示例数据的略微扩展版本,以便更清楚地了解代码如何在组而不是整个数据框上运行:

df = pd.DataFrame({ 'Cust':list('AAABBB'),'PA1':list('HHHMMH'),
                    'PA2': list('MLMMMM'),'PA3':[1,2,3,3,3,1] })

  Cust PA1 PA2 PA3
0    A   H   M   1
1    A   H   L   2
2    A   H   M   3
3    B   M   M   3
4    B   M   M   3
5    B   H   M   1

第一步是创建一个每个客户一行的新数据框。这只是一种快速而肮脏的方法,对于手边的示例来说很好,但是您可能希望以不同的方式执行此操作,具体取决于您要对其他任何列执行的操作。

df2 = df.groupby('Cust').sum()

      PA1  PA2  PA3
Cust               
A     HHH  MLM  123
B     MMH  MMM  331

将其作为所需输出的模板,我们可以循环遍历原始数据框的相关列,并使用groupby/applyjoin/unique替换现有列中的值:

for col in ['PA1','PA2','PA3']:
    df2[col] = df.groupby('Cust')[col].apply( lambda x: 
                                              '&'.join( x.astype(str).unique() ))

      PA1  PA2    PA3
Cust                 
A       H  M&L  1&2&3
B     M&H    M    3&1