Python 在索引行和数据帧中的每一行之间查找公共非空列

Python 在索引行和数据帧中的每一行之间查找公共非空列,python,pandas,Python,Pandas,我想找出索引行和数据帧之间常见的非空列的百分比。例如: df(指数)= 和df1= A B C D E F 1 3 5 NaN 7 NaN NaN 2 4 NaN 3 2 7 6 NaN 5 2 NaN 2 NaN 5 NaN 7 3 我在寻找非空公共列的百分比。因此理想的结果是: A B C D E F Common% 1 3 5 NaN 7 NaN 75

我想找出索引行和数据帧之间常见的非空列的百分比。例如:

df(指数)=

和df1=

A   B   C   D   E   F
1   3   5  NaN  7  NaN
NaN 2   4  NaN  3   2
7   6  NaN  5   2  NaN
2  NaN  5  NaN  7   3
我在寻找非空公共列的百分比。因此理想的结果是:

    A   B   C   D   E   F   Common%
    1   3   5  NaN  7  NaN    75
    NaN 2   4  NaN  3   2     75
    7   6  NaN  5   2  NaN    50
    2  NaN  5  NaN  7   3     100

提前感谢

如果我正确理解了您的问题,应该这样做:

df['Common%'] = (df == index).sum() / index.shape * 100

请注意,只有当
索引
是一个
系列

时,这才有效。如果我正确理解了您的问题,这应该可以:

df['Common%'] = (df == index).sum() / index.shape * 100
请注意,只有当
索引
是一个
系列

时,这才有效。您可以执行以下操作:

  # create mask for non-nan values
v = ~np.isnan(df)
w = ~np.isnan(df1)

# count non zeros of intersection
a = np.count_nonzero(np.logical_and(w, v), axis=1)

# count non zeros of v (number of non-nan values in df)
b = np.count_nonzero(v)

# find common percentage
print((a / b) * 100)
输出

[ 75.  75.  50. 100.]
     A    B    C    D  E    F  common
0  1.0  3.0  5.0  NaN  7  NaN    75.0
1  NaN  2.0  4.0  NaN  3  2.0    75.0
2  7.0  6.0  NaN  5.0  2  NaN    50.0
3  2.0  NaN  5.0  NaN  7  3.0   100.0
可以按如下方式添加新列:

df1['common'] = (a / b) * 100
print(df1)
输出

[ 75.  75.  50. 100.]
     A    B    C    D  E    F  common
0  1.0  3.0  5.0  NaN  7  NaN    75.0
1  NaN  2.0  4.0  NaN  3  2.0    75.0
2  7.0  6.0  NaN  5.0  2  NaN    50.0
3  2.0  NaN  5.0  NaN  7  3.0   100.0
你可以做:

  # create mask for non-nan values
v = ~np.isnan(df)
w = ~np.isnan(df1)

# count non zeros of intersection
a = np.count_nonzero(np.logical_and(w, v), axis=1)

# count non zeros of v (number of non-nan values in df)
b = np.count_nonzero(v)

# find common percentage
print((a / b) * 100)
输出

[ 75.  75.  50. 100.]
     A    B    C    D  E    F  common
0  1.0  3.0  5.0  NaN  7  NaN    75.0
1  NaN  2.0  4.0  NaN  3  2.0    75.0
2  7.0  6.0  NaN  5.0  2  NaN    50.0
3  2.0  NaN  5.0  NaN  7  3.0   100.0
可以按如下方式添加新列:

df1['common'] = (a / b) * 100
print(df1)
输出

[ 75.  75.  50. 100.]
     A    B    C    D  E    F  common
0  1.0  3.0  5.0  NaN  7  NaN    75.0
1  NaN  2.0  4.0  NaN  3  2.0    75.0
2  7.0  6.0  NaN  5.0  2  NaN    50.0
3  2.0  NaN  5.0  NaN  7  3.0   100.0

我不明白公共值是什么意思?所以对于df1中的第一行,AB C和E是非空的,而在df(索引)中,A C E和F是非空的。因此,两者之间存在共同点。所以{A,C,E}/{A,C,E,F}=3/4,等于75%,我不明白公共值是什么意思?所以对于df1中的第一行,ab C和E是非空的,而在df(索引)中,A C E和F是非空的。因此,两者之间存在共同点。所以{A,C,E}/{A,C,E,F}=3/4,等于75%