Python 如何将一个数据帧中的行与另一个数据帧中的行进行匹配?
各位。我在尝试使用Python库将一个数据帧中的行匹配到另一个数据帧时遇到了一个问题 我有两个数据帧,df_1和df_2,它们有三个完全相同的列:“日期”、“位置”和“数据”列。df_1中的位置值是正确的,但在df_2中,某些位置值是不正确的。总而言之,我要做的是为df_2保留所有三列及其各自的值,但“Location”列中的值与df_1的“Location”列中的值不匹配的行除外 看起来是这样的: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
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中的位置值不匹配,我希望忽略它。