我有两只熊猫。它们共享相同的列。第一个较大,并且不包含缺失值,例如
import pandas as pd
import numpy as np
df_full = pd.DataFrame({
"a": ["apple", "apple", "banana"],
"b": [1, 2, 1]
})
a b
0 apple 1
1 apple 2
2 banana 1
第二行的行数较少,并且可能包含缺少的值
df_partial = pd.DataFrame({
"a": ["apple", "apple"],
"b": [np.nan, np.nan]
})
a b
0 apple NaN
1 apple NaN
我想确定是否可以通过从df_full
中删除行和元素并重新排序行来获得df_partial
。或者换一种方式,我们可以将df_partial
中的每一行与df_full
中的唯一行进行匹配,其中一行匹配的条件是其非缺失元素相等
因此,在上面的示例中,可以如上所述获得df_partial
,因为我们可以将df_partial
的前两行与df_full
的前两行(以任意顺序)匹配
或者,数据帧
df_partial2 = pd.DataFrame({
"a": ["banana"],
"b": [2]
})
a b
0 banana 2
无法按说明获取,因为df_full
中没有匹配的行
最后,还有一个稍微棘手的例子,dataframe
df_partial3 = pd.DataFrame({
"a": ["apple", "apple", np.nan],
"b": [1, 2, 2]
})
a b
0 apple 1
1 apple 2
2 NaN 2
无法按所述获取,因为即使可以将df_partial3
中的每一行与df_full
中的一行进行匹配,也无法从df_full
中选择唯一的行来匹配df_partial3
中的所有内容
其他一些考虑:
df_partial
行循环到df_full
行来解决这个问题,但是如果可能的话,我想要更高效的东西编辑:上面有一件事我没有说清楚。行的顺序并不重要。例如,数据帧
df_partial4 = pd.DataFrame({
"a": ["apple", "apple"],
"b": [np.nan, 1]
})
a b
0 apple NaN
1 apple 1
即使我们必须将df_partial4
中的第二行与df_full
中的第一行匹配,并且将df_partial4
中的第一行与df_full
中的第二行匹配,也可以如上所述获得
感谢@user202729建议查找最大匹配问题。 这是我最终使用的解决方案
TL;医生:
下面,我将使用问题中给出的第一个示例更详细地介绍这些步骤
首先,我们创建一个矩阵,其中元素i,j是
True
,如果full_df
的行i与partial_df
的行j匹配,否则为false我们可以将其视为二部图的邻接矩阵,其中顶点是数据帧中的行,边位于匹配的行之间。我们想知道是否可以将
df_partial
中的每一行与df_full
中的一行进行匹配。一个更一般的问题是,在df_partial
中我们可以匹配的最大行数是多少这个问题称为二部最大匹配问题,可以使用Hopcroft–Karp算法解决。据我所知,这是解决这个问题最有效的方法。在scipy中有一个实现
scipy函数
maximum_bipartite_matching
使用-1表示无法匹配的顶点,因此如果没有-1值,则df_partial
是df_full
的“子集”相关问题 更多 >
编程相关推荐