Python - подсчитать количество точных совпадений между одним списком и несколькими списками - PullRequest
0 голосов
/ 01 декабря 2018

Во-первых, у меня есть файл 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

Объяснение результата:

  • В списке 1 есть одно совпадение: 'abc'
  • В списке 2 есть три совпадения: 'abc',' def ',' yz1 '
  • В списке 3 есть два совпадения:' stu ',' mno1 '

Мой вопрос похож на thisвопрос , за исключением того, что данные транспонированы и есть несколько списков для сравнения, для которых может потребоваться цикл.

Ответы [ 4 ]

0 голосов
/ 01 декабря 2018

Использование 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])
0 голосов
/ 01 декабря 2018

С:

   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
0 голосов
/ 01 декабря 2018

Создайте список ненулевых значений основного списка и используйте 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
0 голосов
/ 01 декабря 2018

Вы можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...