【问题标题】:How do I match rows in one pandas dataframe to the rows in another dataframe?如何将一个熊猫数据框中的行与另一个数据框中的行匹配?
【发布时间】:2020-04-19 17:12:33
【问题描述】:

每个人。我在尝试使用 Python Pandas 库将一个数据帧中的行与另一个数据帧匹配时遇到了问题。

我有两个数据框 df_1 和 df_2,它们具有三个完全相同的列:“日期”、“位置”和“数据”列。 df_1 中的位置值是正确的,但是,在 df_2 中,某些位置值不正确。总而言之,我想要做的是将所有三列及其各自的值保留在 df_2 中,但“位置”列中的值与“位置”中的值不匹配的行除外df_1 的列。

看起来像这样:

df_1:
Date        Location        Data
1/1/2000    12345670        57.573
1/1/2000    12345671        67.374
1/1/2000    12345672        56.926
1/1/2000    12345673        62.492
1/1/2000    12345674        65.735
1/2/2000    12345670        56.684
1/2/2000    12345671        58.243
1/2/2000    12345672        60.305
1/2/2000    12345673        61.294


df_2:
Date        Location        Data
1/1/2000    12345670        64.684
1/1/2000    12345671        55.574
1/1/2000    12345672        53.983
1/1/2000    12345673        63.103
1/1/2000    12345674        69.485
1/1/2000    EUF57324        57.682
1/1/2000    ARIF6872        56.773
1/1/2000    GHUEF398        65.126
1/2/2000    12345670        62.503
1/2/2000    12345671        60.604
1/2/2000    MAR40521        54.468
1/2/2000    WOP68494        67.295

如您所见,df_2 的“位置”列中的某些值与 df_1 中的数值特征不同。 df_2 的“位置”列中的其他值与 df_1 的“位置”列重叠。我只想将 df_2 的“日期”和“位置”列中的行与 df_1 的“位置”和“日期”列中的行匹配,以便df_2 中的奇数位置值被省略。我不需要 df_1 中的“Data”列,只需要“Date”和“Location”列来匹配。

我希望匹配的数据框如下所示:

Matched_df_2:
Date        Location        Data
1/1/2000    12345670        64.684
1/1/2000    12345671        55.574
1/1/2000    12345672        53.983
1/1/2000    12345673        63.103
1/1/2000    12345674        69.485
1/2/2000    12345670        62.503
1/2/2000    12345671        60.604   

奇数位置值将消失。

我尝试使用 pandas 中的“合并”功能进行连接,但它一直给我一个空数据框。

import pandas as pd

df_1 = pd.read_csv('file_1.csv')
df_2 = pd.read_csv('file_2.csv')
df_1 = df_1.astype({'Location': 'object'}) #conversion of datatype to "object" from int64 

print(df_1)
print(df_2)

df_merge = pd.merge(df_1, df_2, on=['Date', 'Location'])

print(df_merge)

#It returns an empty dataframe, as shown below 

Empty DataFrame
Columns: [Date, Location, df_1_data, df_2_data]
Index: [] 

我认为我只是在合并时遗漏了一些东西。在 SQL 中,使用 INNER JOIN 或匹配 WHERE 语句来将 data_table_2 的“日期”和“位置”中的行与 data_table_1 中的行进行匹配是很简单的。

我希望我在这里写的东西是有意义的。感谢您的帮助。

【问题讨论】:

  • 是否准确地说您只想要 df_2 中与 df_1 中的位置有对应匹配的值?此外,df_1 中与 df_2 不匹配的位置不存在或可以忽略?
  • @JeffH,对于您的第一个问题,是的,这是准确的。对于您的第二部分,如果 df_2 中的位置值与 df_1 中的位置值不匹配,我希望它被忽略。

标签: python database pandas dataframe


【解决方案1】:

罪魁祸首是这一行:

df1 = df1.astype({'Location': 'object'})

您想将它们转换为 str

df1 = df1.astype({'Location': 'str'})

df_merge = pd.merge(df1, df2, on=['Date', 'Location'])

print(df_merge)

       Date  Location  Data_x  Data_y
0  1/1/2000  12345670  57.573  64.684
1  1/1/2000  12345671  67.374  55.574
2  1/1/2000  12345672  56.926  53.983
3  1/1/2000  12345673  62.492  63.103
4  1/1/2000  12345674  65.735  69.485
5  1/2/2000  12345670  56.684  62.503
6  1/2/2000  12345671  58.243  60.604

【讨论】:

    【解决方案2】:

    您只需要将 df1 中的变量“Location”转换为字符串,因为 df2 中的变量“Location”是字符串。您可以使用以下代码:

    df1['Location'] = df1['Location'].astype(str)
    df1.dtypes
    df2.dtypes
    match = pd.merge(df1, df2, on = ['Date', 'Location'])
    print(match)
    
           Date  Location  Data_x  Data_y
    0  1/1/2000  12345670  57.573  64.684
    1  1/1/2000  12345671  67.374  55.574
    2  1/1/2000  12345672  56.926  53.983
    3  1/1/2000  12345673  62.492  63.103
    4  1/1/2000  12345674  65.735  69.485
    5  1/2/2000  12345670  56.684  62.503
    6  1/2/2000  12345671  58.243  60.604
    
    

    【讨论】:

      【解决方案3】:

      你可以使用“isin()”方法:

      crit= df2.Location.astype(str).isin(df1.Location.astype(str))                                                        
      df2= df2.loc[crit]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-20
        • 2021-11-15
        • 1970-01-01
        • 2020-09-20
        • 2014-06-10
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        相关资源
        最近更新 更多