合并不同长度的数据框,数据框中的“连接”列没有唯一值

时间:2018-11-25 10:58:24

标签: python pandas join merge left-join

我有泰坦尼克号数据集,数据包含在不同的csv文件中。我需要将所有文件合并到一个数据框中以使用数据。但是文件之一不是拥有唯一值的任何列。我正在尝试使用merge命令合并数据,但是记录数却增加了。

enter code here

Df1

    Ticket  Fare    Cabin   Embarked
0   110152  86.50   B79       S
1   110152  92.50   B77       S
2   110413  79.65   E67       S
3   110413  79.65   E68       S
4   110465  52.00   C110      S
5   110465  52.00   A14       S
6   110564  26.55   C52       S
7   110813  75.25   D37       C
8   111240  33.50   B19       S
9   111320  38.50   E63       S

df2 

        Survived    Ticket
PassengerId     
1         0         A/5 21171
2         1         PC 17599
3         1         STON/O2. 3101282
4         1         113803
5         0         373450
6         0         330877
7         0         17463
8         0         349909
9         1         347742
10        1         237736

对于同一票号,有些票的价格不同。这将为该乘客以不同的价格添加两个相同机票号的记录。

例如机票110152有两个价格。合并后,购买此票的任何一位顾客都有两个记录,并具有两个不同的价格。

 pass
engerID   Survived  Ticket   Fare     Cabin  Embarked
 0    0       110152        86.50      NaN      S
 0    1       110152        90.50      C85      C
 1    1     STON/O2.3101   7.9250      NaN      S
 2    1      113803        53.1000     C123     S
 3    0      113803        53.1000     C123     S
 4    0       373450       8.0500       NaN     S

这里的旅客0必须以不同的价格记录,但合并后应该只有一个记录。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么问题在于合并语句之后有多个记录。

您可以清除同一票证号的多个记录,并仅保留1条记录。像这样:

In [298]: df1['rank'] = df1.groupby('Ticket')['Fare'].rank('first',ascending=False)

In [299]: df1
Out[299]: 
   Ticket   Fare Cabin Embarked  rank
0  110152  86.50   B79        S   2.0
1  110152  92.50   B77        S   1.0
2  110413  79.65   E67        S   1.0
3  110413  79.65   E68        S   2.0
4  110465  52.00  C110        S   1.0
5  110465  52.00   A14        S   2.0
6  110564  26.55   C52        S   1.0
7  110813  75.25   D37        C   1.0
8  111240  33.50   B19        S   1.0
9  111320  38.50   E63        S   1.0

In [303]: df1 = df1.query('rank == 1.0').drop('rank',1)

In [304]: df1
Out[304]: 

   Ticket   Fare Cabin Embarked
1  110152  92.50   B77        S
2  110413  79.65   E67        S
4  110465  52.00  C110        S
6  110564  26.55   C52        S
7  110813  75.25   D37        C
8  111240  33.50   B19        S
9  111320  38.50   E63        S

现在,如果看到,则df1每个票证号码只有1条记录。现在,您的merge语句将不会产生重复。

让我知道这是否有帮助。