python - 将重复行转换为独立列

标签 python pandas

我有一个如下所示的数据框:

ID,CUSTOMER_ID,ACC_NUMBER,TRANSACTION_ID,PACK_DESC,PACK_VALIDITY,PACK_NUMBER
1,ABCVRXJ,1027,1248,PackA,30,PACKA-XXXX
2,ABCVRXJ,1029,1249,PackC,32,PACKC-XXXX
3,XUVZ200,1028,12491,PackB,31,PACKB-XXXX
4,XUVZ200,1030,12421,PackD,33,PACKD-XXXX

我希望最终的数据框看起来像这样:

ID,CUSTOMER_ID,ACC_NUMBER,TRANSACTION_ID,PACK_DESC,PACK_VALIDITY,PACK_NUMBER_1,PACK_NUMBER_2
1,ABCVRXJ,1027,1248,PackA,30,PACKA-XXXX,PACKC-XXXX
3,XUVZ200,1028,12491,PackB,31,PACKB-XXXX,PACKD-XXXX

每个选择 2 个包的 CUSTOMER_ID 应转换为一行,其中两个 PACK_NUMBER 都是 2 个新列。

我尝试过:

df['index'] = df.groupby('CUSTOMER_ID').cumcount()
df_vchrNumber = df.pivot(index='CUSTOMER_ID', columns='index', values='PACK_NUMBER').rename(columns=lambda x: 'PACK_NUMBER_'+str(x + 1))
df_vchrNumber = df_vchrNumber.fillna('').reset_index()

但是这会返回,

CUSTOMER_ID,PACK_NUMBER_1,PACK_NUMBER_2
0123456789,PACKA-XXXX,PACKC-XXXX
9876543210,PACKB-XXXX,PACKD-XXXX

**但这不是预期的输出,因为我不确定如何包含其他列**

有人介意帮我一下吗?

最佳答案

如果只需要 PACK_NUMBER 的第一个和最后一个值,请使用 DataFrame.drop_duplicates对于每组的第一个值和每组 PACK_NUMBER 的最后一个值:

s = (df.drop_duplicates('CUSTOMER_ID', keep='last')
       .set_index('CUSTOMER_ID')['PACK_NUMBER']
       .rename('PACK_NUMBER_2'))
df = (df.drop_duplicates('CUSTOMER_ID')
        .rename(columns={'PACK_NUMBER':'PACK_NUMBER_1'})
        .join(s, on='CUSTOMER_ID'))
print (df)
   ID CUSTOMER_ID  ACC_NUMBER  TRANSACTION_ID PACK_DESC  PACK_VALIDITY  \
0   1     ABCVRXJ        1027            1248     PackA             30   
2   3     XUVZ200        1028           12491     PackB             31   

  PACK_NUMBER_1 PACK_NUMBER_2  
0    PACKA-XXXX    PACKC-XXXX  
2    PACKB-XXXX    PACKD-XXXX 

您的解决方案应更改为删除重复项并加入系列:

df['index']=  df.groupby('CUSTOMER_ID').cumcount()
df_vchrNumber = (df.pivot(index='CUSTOMER_ID', columns='index', values='PACK_NUMBER')
                   .rename(columns=lambda x: 'PACK_NUMBER_'+str(x + 1)))

df=df.drop_duplicates('CUSTOMER_ID').drop('PACK_NUMBER',1).join(df_vchrNumber,on='CUSTOMER_ID')

如果需要处理所有列:

df['index']=  df.groupby('CUSTOMER_ID').cumcount() + 1
df = df.set_index(['CUSTOMER_ID', 'index']).unstack()
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index()
print (df)
  CUSTOMER_ID  ID_1  ID_2  ACC_NUMBER_1  ACC_NUMBER_2  TRANSACTION_ID_1  \
0     ABCVRXJ     1     2          1027          1029              1248   
1     XUVZ200     3     4          1028          1030             12491   

   TRANSACTION_ID_2 PACK_DESC_1 PACK_DESC_2  PACK_VALIDITY_1  PACK_VALIDITY_2  \
0              1249       PackA       PackC               30               32   
1             12421       PackB       PackD               31               33   

  PACK_NUMBER_1 PACK_NUMBER_2  
0    PACKA-XXXX    PACKC-XXXX  
1    PACKB-XXXX    PACKD-XXXX  

关于python - 将重复行转换为独立列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56272218/

相关文章:

python - 使用哪个 python mpi 库?

python - 来自两个不同数据帧的平均值

python - Pandas - groupby,聚合和缩放多列的总和

python - 使用 execfile() 设置函数变量

python - Pandas pd.Grouper 和每组的顺序日期差异

python - 将多嵌套的 dict/json 加载到 pandas 中

python对相似的分类值进行分组

python - 处理 Pandas 中的时区天真日期时间

python - AWS深度学习AMI虚拟环境激活

Python:在子程序中使用模板和替换