第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決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條經(jīng)驗 獲得超7個贊

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


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

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

它按預(yù)期提供:


       a

0  a,b,c

1  a,c,f

3  a,z,c


查看完整回答
反對 回復(fù) 2022-09-20
?
POPMUISE

TA貢獻1765條經(jīng)驗 獲得超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


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

TA貢獻1876條經(jīng)驗 獲得超5個贊

這也解決了它:

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


查看完整回答
反對 回復(fù) 2022-09-20
?
阿波羅的戰(zhàn)車

TA貢獻1862條經(jīng)驗 獲得超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


查看完整回答
反對 回復(fù) 2022-09-20
?
RISEBY

TA貢獻1856條經(jīng)驗 獲得超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


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

TA貢獻1831條經(jīng)驗 獲得超10個贊

IIUC 和布爾濾波器explode


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


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


查看完整回答
反對 回復(fù) 2022-09-20
  • 6 回答
  • 0 關(guān)注
  • 98 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號