代码之家  ›  专栏  ›  技术社区  ›  Java

如何将重复的数据行排列成一行

  •  0
  • Java  · 技术社区  · 5 年前

    我试图使用Python将重复的数据排列成一行。

    我给你举个例子: enter image description here

    “那” 原件

    “那” 目标 “这是我想要完成的。

    我该怎么做?

    顺便说一下,我正在从csv文件中获取原始数据。

     PatientID  Model#  Ear   SerNum    FName   LName   PName   PPhone
    
     P99999    300     Left    1234567  John    Doe Jane Doe    (999) 111-2222
     P99999    400     Right   2345678  John    Doe Jane Doe    (999) 111-2222
    
    
    
     PID      ModleL  SerNumL   ModelR  SerNumR FName   LName   PName  PPhone
     P99999   300     1234567   400     2345678 John    Doe     J.Doe  (999) 111-2222
    
    1 回复  |  直到 5 年前
        1
  •  3
  •   Erfan    5 年前

    首先我们把数据分成 left right . 之后我们用 pandas.DataFrame.merge 把我们的数据放在一起并给出正确的 suffixes :

    df_L = df[df.Ear == 'Left'].drop('Ear',axis=1)
    df_R = df[df.Ear == 'Right'].drop('Ear', axis=1)
    
    print(df_L, '\n')
    print(df_R)
    
      PatientID  Model#   SerNum FName LName     PName          PPhone
    0    P99999     300  1234567  John   Doe  Jane Doe  (999) 111-2222 
    
      PatientID  Model#   SerNum FName LName     PName          PPhone
    1    P99999     400  2345678  John   Doe  Jane Doe  (999) 111-2222
    

    现在我们可以合并回来并给出正确的后缀:

    df = pd.merge(df_L, df_R.iloc[:, :3], on = 'PatientID', suffixes=['Left', 'Right'])
    
    print(df)
      PatientID  Model#Left  SerNumLeft FName LName     PName          PPhone  \
    0    P99999         300     1234567  John   Doe  Jane Doe  (999) 111-2222   
    
       Model#Right  SerNumRight  
    0          400      2345678  
    
        2
  •  1
  •   mr_mo    5 年前

    最佳来源是官方来源:

    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html

    您可能还想了解多索引、级别等。

    我更喜欢加入:

    import pandas as pd
    
    columns = ['PatientID', 'Model#', 'Ear', 'SerNum', 'FName', 'LName', 'PName', 'PPhone']
    data = [[
        'P99999', '300', 'Left', '1234567', 'John', 'Doe', 'Jane Doe', '(999) 111-2222'],
        ['P99999', '400', 'Right', '2345678', 'John', 'Doe', 'Jane Doe', '(999) 111-2222']]
    
    df = pd.DataFrame(data=data, columns=columns)
    df = df.set_index('PatientID')
    
    df = df[df['Ear'] == 'Left'].drop('Ear', axis=1).join(df[df['Ear'] == 'Right'].drop('Ear', axis=1), lsuffix='_left', rsuffix='_right').reset_index()
    

    输出:

      PatientID Model#_left SerNum_left  ... LName_right PName_right    PPhone_right
    0    P99999         300     1234567  ...         Doe    Jane Doe  (999) 111-2222
    

    :
    一。已修复,忘记删除列:)
    2。现在使用您的数据:)

        3
  •  1
  •   BENY    5 年前

    pivot 问题,所以我用 pivot_table 在这里

    s=df.pivot_table(index=['PatientID','FName','LName','PName','PPhone'],columns='Ear',values=['Model#','SerNum'],aggfunc='first')
    s.columns=s.columns.map(' '.join)
    s.reset_index(inplace=True)
    s
      PatientID FName LName     ...      Model# Right SerNum Left SerNum Right
    0    P99999  John   Doe     ...               400     1234567      2345678
    [1 rows x 9 columns]