【问题标题】:How to arrange duplicate rows of data into one row如何将重复的数据行排列成一行
【发布时间】:2019-08-18 16:09:50
【问题描述】:

我正在尝试使用 Python 将重复数据排列成一行。

让我举个例子:

原始”数据框有重复数据。

目标”是我正在努力实现的目标。

我该怎么做?

如果我使用 Pandas,它会是什么样子?

顺便说一句,我正在从 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

【问题讨论】:

  • 能否在您的问题中包含这些数据,以便我们复制和粘贴?
  • 对不起。我只是在问题中添加了文本..

标签: python pandas list csv


【解决方案1】:

首先,我们将数据拆分为leftright。之后我们使用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  

【讨论】:

  • 我喜欢你合并 :-)
  • 嗨@Erfan,我喜欢你的合并方法。我有个问题。如果我还想组合具有左侧数据或右侧数据的行(意思是一侧会有空白数据),我们如何列出数据?因此,数据的整个输出将列出两侧的数据(左耳和右耳数据)以及仅输出一侧的数据。
  • 我使用“how=outer”找到了解决方案,例如:df = pd.merge(df_L.iloc[:, 0:3], df_R.iloc[:, 0:7], on = 'id', 后缀=['L', 'R'], how='outer')
【解决方案2】:

最好的来源是官方来源:

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

编辑
1. 已修复,忘记删除列:)
2. 现在使用您的数据:)

【讨论】:

    【解决方案3】:

    这更像是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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-17
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 2020-01-22
      • 2020-05-22
      相关资源
      最近更新 更多