найти строки, которые разделяют значения - PullRequest
3 голосов
/ 17 марта 2020

У меня есть pandas фрейм данных, который выглядит следующим образом:

df = pd.DataFrame({'name': ['bob', 'time', 'jane', 'john', 'andy'], 'favefood': [['kfc', 'mcd', 'wendys'], ['mcd'], ['mcd', 'popeyes'], ['wendys', 'kfc'], ['tacobell', 'innout']]})
-------------------------------
name |         favefood
-------------------------------
bob  | ['kfc', 'mcd', 'wendys']
tim  | ['mcd']
jane | ['mcd', 'popeyes']
john | ['wendys', 'kfc']
andy | ['tacobell', 'innout']

Для каждого человека я хочу выяснить, сколько favefood других людей пересекаются с их собственным. Т.е. для каждого человека я хочу узнать, сколько других людей имеют непустое пересечение с ними.

Полученный кадр данных будет выглядеть следующим образом:

------------------------------
name |         overlap
------------------------------
bob  |            3
tim  |            2
jane |            2
john |            1
andy |            0 

Проблема в том, что у меня есть около 2 миллионов строк данных. Единственный способ, которым я могу думать об этом, был бы через вложенный for-l oop - т.е. для каждого человека, go через весь фрейм данных, чтобы увидеть, что перекрывается (это было бы крайне неэффективно). Будет ли в любом случае сделать это более эффективно, используя запись pandas? Спасибо!

1 Ответ

4 голосов
/ 17 марта 2020

Logi c позади него

s=df['favefood'].explode().str.get_dummies().sum(level=0)
s.dot(s.T).ne(0).sum(axis=1)-1
Out[84]: 
0    3
1    2
2    2
3    1
4    0
dtype: int64
df['overlap']=s.dot(s.T).ne(0).sum(axis=1)-1

Метод из sklearn

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
s=pd.DataFrame(mlb.fit_transform(df['favefood']),columns=mlb.classes_, index=df.index)

s.dot(s.T).ne(0).sum(axis=1)-1

0    3
1    2
2    2
3    1
4    0
dtype: int64
...