【问题标题】:Merge different length dataframes, Join column in dataframe dont have unique values合并不同长度的数据框,数据框中的连接列没有唯一值
【发布时间】:2019-04-27 06:02:56
【问题描述】:

我有 Titanic 数据集,其中包含不同 csv 文件中的数据。我需要将所有文件合并到一个数据框中才能使用数据。但是其中一个文件不是具有唯一值的任何列。我正在尝试使用合并命令合并数据,但记录数增加。

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 必须记录不同的价格,但合并后应该只有一条记录。

【问题讨论】:

    标签: python pandas join merge left-join


    【解决方案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 语句将不会产生重复。

    如果这有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 2018-10-02
      • 2019-12-21
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多