如何将重复的数据行排列成一行
Posted
技术标签:
【中文标题】如何将重复的数据行排列成一行【英文标题】: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
【问题讨论】:
能否在您的问题中包含这些数据,以便我们复制和粘贴? 对不起。我只是在问题中添加了文本.. 【参考方案1】:首先,我们将数据拆分为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
【讨论】:
我喜欢你合并 :-) 嗨@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]
【讨论】:
以上是关于如何将重复的数据行排列成一行的主要内容,如果未能解决你的问题,请参考以下文章
EditPlus排列数据。 如何将一段数据例如:10000,123123,566自动按位数排列成为566,10000,123123
java编写程序,定义一个2行10列的数组,将数组第一行的数据从小到大排列,第二行数据从大到