如何将一个熊猫数据框中的行与另一个数据框中的行匹配?

时间:2019-12-31 04:29:10

标签: python database pandas dataframe

每个人。我在尝试使用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 中的“ 数据”列,只需匹配“日期”和“位置”列即可。

我希望匹配的数据帧看起来像这样:

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   

奇数位置值将消失。

我试图在熊猫中使用“合并”功能进行联接,但是它一直给我一个空的数据框。

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 中的行进行匹配将非常简单。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您只需要将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

答案 2 :(得分:0)

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

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