Python熊猫从另一个df中搜索df中的值

时间:2020-04-08 17:45:05

标签: python pandas dataframe match

我有两个数据框:-

Df1

Time   V1    V2
02:00  D3F3  0041
02:01  DD34  0040

Df2

 FileName  V1    V2
   1111.txt  D3F3  0041
   2222.txt  0000  0040

基本上我想比较v1 v2列,如果它们匹配,则打印df1的行时间和df2文件名的行。到目前为止,我只能找到

isin()

,它只是为您提供布尔输出。

所以输出将是:

1111.txt 02:00

我开始使用数据帧,因为尽管我可以查询V1 / V2值上的两个df,但我看不到任何方法。任何指针将不胜感激

6 个答案:

答案 0 :(得分:1)

在要具有相同值的数据框列上使用merge。然后,您可以删除具有NaN值的行,因为这些行将没有匹配的值。从那里,您可以打印合并的数据框值,但是您认为合适。

df1 = pd.DataFrame({'Time': ['8a', '10p'], 'V1': [1, 2], 'V2': [3, 4]})
df2 = pd.DataFrame({'fn': ['8.txt', '10.txt'], 'V1': [3, 2], 'V2': [3, 4]})

df1.merge(df2, on=['V1', 'V2'], how='outer').dropna()

===输出:===

  Time  V1  V2      fn
1  10p   2   4  10.txt

答案 1 :(得分:1)

最直观的解决方案是: 1)迭代DF1中的V1列; 2)对于此列中的每个项目,检查此项目是否存在于DF2的V1列中; 3)如果该项目存在于DF2的V1中,则在DF2中找到该项目的索引,然后就可以找到文件名。

答案 2 :(得分:0)

您可以尝试使用pd.concat

在这种情况下,就像:

pd.concat([df1, df2.reindex(df1.index)], axis=1)

它将创建一个具有所有值的新数据框,但是如果两个数据框中的某些值都不匹配,它将返回NaN。如果您不希望发生这种情况,则必须使用以下方法:

pd.concat([df1, df4], axis=1, join='inner')

如果您想了解更多信息,请使用pydata:https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

答案 3 :(得分:0)

您可以将合并选项与内部联接一起使用

    df2.merge(df1,how="inner",on=["V1","V2"])[["FileName","Time"]]

答案 4 :(得分:0)

虽然我认为Eric的解决方案更具Python风格,但是如果您的唯一目的是打印df1和df2具有相同的v1和v2值的行,但前提是两个数据帧的长度相同,则可以执行以下操作:

for row in range(len(df1)):
    if (df1.iloc[row,1:] == df2.iloc[row,1:]).all() == True: 
        print(df1.iloc[row], df2.iloc[row])

答案 5 :(得分:0)

试试这个:

client = boto3.client('s3')

obj = client.get_object(Bucket='', Key='')
data = obj['Body'].read()
df1 = pd.read_excel(io.BytesIO(data), sheet_name='0')
df2 = pd.read_excel(io.BytesIO(data), sheet_name='1')

head = df2.columns[0]
print(head)

data = df1.iloc[[8],[0]].values[0]
print(data)

print(df2)
df2.columns = df2.iloc[0]
df2 = df2.drop(labels=0, axis=0)
df2['Head'] = head
df2['ID'] = pd.Series([data,data])

print(df2)
df2.to_csv('test.csv',index=False)