每个人。我在尝试使用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 中的行进行匹配将非常简单。
我希望我在这里写的东西有意义。谢谢您的帮助。
答案 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]