所以我不知道该怎么做,查了半天我没有找到我的解决方案。
我的数据看起来像这样
import pandas as pd
df1 = pd.DataFrame(
[['132','233','472','098'], ['482','214','980',''], ['107','','',''],
['571','498','',''],], columns=["p1", "p2", "p3", "p4"])
df2 = pd.DataFrame(['532','233','980','132', '298'], columns=["p"])
df1
p1 p2 p3
0 132 233 472
1 482 214 980
2 107
3 571 498
df2
p
0 532
1 233
2 980
3 132
4 298
我希望将 p 列中的值与 p{1-3} 列中的任意一个值进行匹配,并创建一个包含匹配字符串的新列。
所以在这个例子中我想要的输出是
df_output
p1 p2 p3 matched_p
0 132 233 472 233
1 482 214 980 980
2 107
3 571 498
我尝试了以下方法
filter1 = df1['p1'].isin(df2['p'])
filter2 = df1['p2'].isin(df2['p'])
filter3 = df1['p3'].isin(df2['p'])
df1['matched_p'] = df2['p'][filter1 | filter2 | filter3]
但是,这给了我毫无意义的结果。
关于如何解决这个问题有什么想法吗?
最佳答案
你可以试试这个。使用df.isin
和 df.where
与 df.max
超过轴 1。
df1 = df1.replace('',np.nan).astype(float) # to convert everything to float.
df2 = df2.astype(float) #to convert everything to float.
m = df1.isin(df2['p'].to_numpy())
df1['matched_values'] = df1.where(m,0).max(1)
df1
p1 p2 p3 p4 matched_values
0 132.0 233.0 472.0 98.0 233.0
1 482.0 214.0 980.0 NaN 980.0
2 107.0 NaN NaN NaN NaN
3 571.0 498.0 NaN NaN NaN
如果您不想将数据类型转换为float
。
灵感来自@Erfan's解决方案。我结合了我们的方法。
df1['matched'] = (df1.where(
df1.isin(df2['p'].to_numpy()),'').
add(',').sum(1).str.strip(','))
关于python - 匹配来自两个不同数据帧的列值和配对观察,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62179877/