如何从列数不同的两个DataFrame提取公共元素?merge()不适用
要实现你要的结果,核心是找出两个DataFrame中完全匹配的行,同时保留指定的顺序(从结果看是保留DF1里公共元素的顺序),给你两种可行的方法:
方法一:用行元组筛选交集
把DF2的所有行转换成元组集合,然后在DF1里筛选属于这个集合的行,直接保留DF1的原有顺序:
import pandas as pd # 构造贴合你输入的DataFrame,第二列列名为0 df1 = pd.DataFrame({ 'Animals': ['Octopus', 'Fish', 'Mouse', 'Cat', 'Dolphin'], 0: ['Aquatic', 'Aquatic', 'Land', 'Land', 'Aquatic'] }) df2 = pd.DataFrame({ 'Animals': ['Cat', 'Fish', 'Shark'], 0: ['Land', 'Aquatic', 'Aquatic'] }) # 将DF2的行转为元组集合 df2_rows = set(zip(df2['Animals'], df2[0])) # 筛选DF1中匹配的行 result = df1[df1.apply(tuple, axis=1).isin(df2_rows)]
执行后result的行顺序和DF1里的公共元素一致,就是你要的结果。
方法二:Merge后按DF1顺序重排
如果想用merge,也可以先取交集,再按DF1的元素顺序重新排序:
import pandas as pd df1 = pd.DataFrame({ 'Animals': ['Octopus', 'Fish', 'Mouse', 'Cat', 'Dolphin'], 0: ['Aquatic', 'Aquatic', 'Land', 'Land', 'Aquatic'] }) df2 = pd.DataFrame({ 'Animals': ['Cat', 'Fish', 'Shark'], 0: ['Land', 'Aquatic', 'Aquatic'] }) # 先merge得到两个DF的共同行 merged = pd.merge(df1, df2, on=['Animals', 0]) # 按照DF1中Animals的顺序重新排列结果 result = merged.set_index('Animals').reindex(df1['Animals']).dropna().reset_index()
这样两种方法都能解决merge后顺序不符合预期的问题。
内容的提问来源于stack exchange,提问作者Mimikyu o_0
相关产品推荐
相关产品推荐

