亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

檢查熊貓列是否包含列表中的所有元素

檢查熊貓列是否包含列表中的所有元素

喵喵時光機 2022-09-20 16:46:18
我有一個像這樣的df:frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})以及項目列表:letters = ['a','c']我的目標是從中獲取至少包含 2 個元素的所有行frameletters我想出了這個解決方案:for i in letters:     subframe = frame[frame['a'].str.contains(i)]這給了我想要的東西,但就可伸縮性而言,它可能不是最好的解決方案。是否有任何“矢量化”解決方案?謝謝
查看完整描述

6 回答

?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

我會建立一個系列列表,然后應用一個矢量化:np.all


contains = [frame['a'].str.contains(i) for i in letters]

resul = frame[np.all(contains, axis=0)]

它按預期提供:


       a

0  a,b,c

1  a,c,f

3  a,z,c


查看完整回答
反對 回復 2022-09-20
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

一種方法是使用 str.split 將列值拆分為列表,并檢查是否為所獲取列表的子集set(letters)

letters_s = set(letters)

frame[frame.a.str.split(',').map(letters_s.issubset)]


     a

0  a,b,c

1  a,c,f

3  a,z,c

基準:


def serge(frame):

    contains = [frame['a'].str.contains(i) for i in letters]

    return frame[np.all(contains, axis=0)]


def yatu(frame):

    letters_s = set(letters)

    return frame[frame.a.str.split(',').map(letters_s.issubset)]


def austin(frame):

    mask =  frame.a.apply(lambda x: np.intersect1d(x.split(','), letters).size > 0)

    return frame[mask]


def datanovice(frame):

    s = frame['a'].str.split(',').explode().isin(letters).groupby(level=0).cumsum()

    return frame.loc[s[s.ge(2)].index.unique()]


perfplot.show(

    setup=lambda n: pd.concat([frame]*n, axis=0).reset_index(drop=True), 


    kernels=[

        lambda df: serge(df),

        lambda df: yatu(df),

        lambda df: df[df['a'].apply(lambda x: np.all([*map(lambda l: l in x, letters)]))],

        lambda df: austin(df),

        lambda df: datanovice(df),

    ],


    labels=['serge', 'yatu', 'bruno','austin', 'datanovice'],

    n_range=[2**k for k in range(0, 18)],

    equality_check=lambda x, y: x.equals(y),

    xlabel='N'

)

http://img1.sycdn.imooc.com//63297e130001ce9f08390589.jpg


查看完整回答
反對 回復 2022-09-20
?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

這也解決了它:

frame[frame['a'].apply(lambda x: np.all([*map(lambda l: l in x, letters)]))]


查看完整回答
反對 回復 2022-09-20
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

您可以使用 :np.intersect1d


import pandas as pd

import numpy as np


frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c']})

letters = ['a','c']


mask =  frame.a.apply(lambda x: np.intersect1d(x.split(','), letters).size > 0)

print(frame[mask])


    a

0  a,b,c

1  a,c,f

3  a,z,c


查看完整回答
反對 回復 2022-09-20
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

使用集:是次級集:


frame = pd.DataFrame({'a' : ['a,b,c', 'a,c,f', 'b,d,f','a,z,c','x,y']})

letters = ['a','c']


frame[frame['a'].apply(lambda x: set(letters).issubset(x))]


Out:


       a

0  a,b,c

1  a,c,f

3  a,z,c


查看完整回答
反對 回復 2022-09-20
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

IIUC 和布爾濾波器explode


這個想法是創建一個單一的系列,然后我們可以分組索引,使用累積總和來計算列表的真實發生次數


s = frame['a'].str.split(',').explode().isin(letters).groupby(level=0).cumsum()


print(s)


0    1.0

0    1.0

0    2.0

1    1.0

1    2.0

1    2.0

2    0.0

2    0.0

2    0.0

3    1.0

3    1.0

3    2.0

frame.loc[s[s.ge(2)].index.unique()]


out:


       a

0  a,b,c

1  a,c,f

3  a,z,c


查看完整回答
反對 回復 2022-09-20
  • 6 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號