Python-计算一个列表和多个列表之间的完全匹配数

时间:2018-12-01 20:15:52

标签: python pandas dataframe

首先,我有一个excel文件(或csv文件),我已将其转换为数据帧(df)。

接下来,第一列中有一个字符串主列表,其中包含字母数字字符。

然后,在随后的列中有字符串列表,其长度可以相同(list1),较短(list2)或较长(list3)。

我想count(或summaster_list与其他列表之间的完全匹配数。


# Assign spreadsheet filename to `file`
file = "list_match.xlsx"

# Load spreadsheet
import pandas as pd
df = pd.read_excel(file)

print (df)
master_list list1   list2   list3
abc         abc     abc     stu
def         xxx     def     zzz
ghi         xxx     yyy     zzz
jkl         xxx     yyy     zzz
mno1        xxx     yz1     zzz
pqr         xxx             zzz
stu         xxx             zzz
vwx         xxx             zzz
yz1         xxx             zzz
yz2         xx1             zzz
yz3         xx1             zzz
                            zzz
                            mno1
                            zzz

目标是创建以下结果:

List     Count
list1    1
list2    3
list3    2

结果说明:

  • 列表1中有一个匹配项:“ abc”
  • 列表2中有三个匹配项:“ abc”,“ def”,“ yz1”
  • 列表3中有两个匹配项:“ stu”,“ mno1”

我的问题类似于this question,除了数据已转置并且有多个要比较的列表可能需要循环之外。

4 个答案:

答案 0 :(得分:1)

df.isin替换空字符串后,您可以使用NaN

df.replace(r'^\s*$', 'NaN', regex=True).isin(df.master_list.values).sum()

这将统计df列中df.master_list元素的所有出现。请注意,[sum()][1]默认沿0轴(列方向),默认情况下会跳过null / NaN值,因此与以下内容相同:

df.replace(r'^\s*$', 'NaN', regex=True).isin(df.master_list.values).sum(axis=0, skipna=True)

示例:

>>> df
  list1 list2 master_list
0   abc   stu         abc
1   yyy   xxx         def
2         xxx
3         xxx
4         xxx
>>> df.replace(r'^\s*$', 'NaN', regex=True).isin(df.master_list.values).sum()
list1          1
list2          0
master_list    2
dtype: int64

答案 1 :(得分:1)

使用:

   master_list list1 list2 list3
0          abc   abc   abc   stu
1          def   xxx   def   zzz
2          ghi   xxx   yyy   zzz
3          jkl   xxx   yyy   zzz
4         mno1   xxx   yz1   zzz
5          pqr   xxx   NaN   zzz
6          stu   xxx   NaN   zzz
7          vwx   xxx   NaN   zzz
8          yz1   xxx   NaN   zzz
9          yz2   xx1   NaN   zzz
10         yz3   xx1   NaN   zzz
11         NaN   NaN   NaN   zzz
12         NaN   NaN   NaN  mno1
13         NaN   NaN   NaN   zzz

使用df.applynp.isin

df.apply(lambda col:np.isin(col,df.master_list).sum())
and 

df.isin

df.isin(df.master_list.dropna().tolist()).sum()

结果:

master_list    11
list1           1
list2           3
list3           2
dtype: int64

答案 2 :(得分:1)

创建一个主列表的非空值列表,并使用dataframe.isin

master_list = df.loc[df['master_list'].notnull(), 'master_list'].tolist()
df.iloc[:, 1:].isin(master_list).sum()



list1    1
list2    3
list3    2

答案 3 :(得分:1)

使用numpy广播

s1=df.iloc[:,1:].values
s2=df['master_list'].values[:,None]
np.sum(s1==s2[:,None],1).sum(0)
Out[409]: array([1, 3, 2])