首先,我有一个excel文件(或csv文件),我已将其转换为数据帧(df
)。
接下来,第一列中有一个字符串主列表,其中包含字母数字字符。
然后,在随后的列中有字符串列表,其长度可以相同(list1
),较短(list2
)或较长(list3
)。
我想count
(或sum
)master_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
结果说明:
我的问题类似于this question,除了数据已转置并且有多个要比较的列表可能需要循环之外。
答案 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.apply
和np.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])