【问题标题】:find rows that share values查找共享值的行
【发布时间】:2020-03-16 21:57:16
【问题描述】:

我有一个如下所示的 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']

对于每个人,我想知道有多少其他人的最爱食物与他们自己的重叠。 即,对于每个人,我想知道有多少其他人与他们有非空交集。

生成的数据框如下所示:

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

问题是我有大约 200 万行数据。我能想到的唯一方法是通过嵌套的 for 循环 - 即对于每个人,遍历整个数据框以查看重叠的内容(这将非常低效)。无论如何使用熊猫表示法可以更有效地做到这一点吗?谢谢!

【问题讨论】:

  • 请以其他人可以用来粘贴到其 IDE 中的格式(即代码)发布您的数据
  • 添加了示例数据帧的代码 sn-p

标签: python pandas dataframe intersection


【解决方案1】:

背后的逻辑

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

【讨论】:

  • get_dummies?一点也不差!
  • get_dummies 是如此的流畅和强大!
  • @Ukrainian-serge 谢谢你,你可能也想看看 sklearn 方法 :-)
  • @YOBEN_S 我现在只是一名日常工作的数据分析师。话虽这么说,你有什么值得一提的初学者机器学习材料吗?
  • @Ukrainian-serge 从示例开始总是比阅读更好,你可以查看 kaggle Titanic
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多