Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将一个数据帧中的行与另一个数据帧中的行进行匹配?_Python_Database_Pandas_Dataframe - Fatal编程技术网

Python 如何将一个数据帧中的行与另一个数据帧中的行进行匹配?

Python 如何将一个数据帧中的行与另一个数据帧中的行进行匹配?,python,database,pandas,dataframe,Python,Database,Pandas,Dataframe,各位。我在尝试使用Python库将一个数据帧中的行匹配到另一个数据帧时遇到了一个问题 我有两个数据帧,df_1和df_2,它们有三个完全相同的列:“日期”、“位置”和“数据”列。df_1中的位置值是正确的,但在df_2中,某些位置值是不正确的。总而言之,我要做的是为df_2保留所有三列及其各自的值,但“Location”列中的值与df_1的“Location”列中的值不匹配的行除外 看起来是这样的: df_1: Date Location Data 1/1/2000

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

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

看起来是这样的:

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
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   
如您所见,df_2的“位置”列中的某些值与df_1中的数值特征不同。df_2的“位置”列中的其他值与df_1的“位置”列重叠。我只想将df_2的“Date”和“Location”列中的行与df_1的“Location”和“Date”列中的行进行匹配,以便省略df_2中的奇数位置值。我不需要dfu 1中的“Data”列,只需要匹配“Date”和“Location”列

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

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
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中的“merge”函数来进行连接,但它一直给我一个空的数据帧

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中,使用内部JOIN或matching WHERE语句将data_table_2的“日期”和“位置”中的行与data_table_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

罪魁祸首是这样的:

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

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


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

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

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


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