我有两个数据框:-
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,但我看不到任何方法。任何指针将不胜感激
答案 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)