поиск слов в dataframe [дубликат]

<?php
$selfClosing = explode(',', 'area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed');

$html = '
<p><a href="#">foo</a></p>
<hr/>
<br/>
<div>name</div>';

$dom = new DOMDocument();
$dom->loadHTML($html);
$els = $dom->getElementsByTagName('*');
foreach ( $els as $el ) {
    $nodeName = strtolower($el->nodeName);
    if ( !in_array( $nodeName, $selfClosing ) ) {
        var_dump( $nodeName );
    }
}

Выход:

string(4) "html"
string(4) "body"
string(1) "p"
string(1) "a"
string(3) "div"

В основном просто определяют имена узлов узлов, которые закрываются самостоятельно, загружают всю строку html в библиотеку DOM, захватывают все элементы, перебирают и отфильтровывают которые не закрываются и не работают на них.

Я уверен, что вы уже знаете, что вам не следует использовать регулярное выражение для этой цели.

207
задан piRSquared 5 January 2017 в 00:46
поделиться

8 ответов

import pandas as pd
k=pd.DataFrame(['hello','doubt','hero','help'])
k.columns=['some_thing']
t=k[k['some_thing'].str.contains("hel")]
d=k.replace(t,'CS')

::: OUTPUT :::

k
Out[95]: 
   some_thing
0  hello
1  doubt
2  hero
3   help

t
Out[99]: 
   some_thing
0  hello
3   help

d
Out[96]: 
    some_thing
0     CS
1  doubt
2  hero
3     CS
5
ответ дан Ayush Gupta 17 August 2018 в 08:53
поделиться

Быстрое примечание: если вы хотите сделать выбор на основе частичной строки, содержащейся в индексе, попробуйте следующее:

df['stridx']=df.index
df[df['stridx'].str.contains("Hello|Britain")]
24
ответ дан Christian 17 August 2018 в 08:53
поделиться
  • 1
    Вы можете просто df [df.index.to_series (). Str.contains ('LLChit')] – Yury Bayda 8 May 2015 в 21:27

Вот что я сделал для частичных совпадений строк. Если у кого-то есть более эффективный способ сделать это, пожалуйста, дайте мне знать.

def stringSearchColumn_DataFrame(df, colName, regex):
    newdf = DataFrame()
    for idx, record in df[colName].iteritems():

        if re.search(regex, record):
            newdf = concat([df[df[colName] == record], newdf], ignore_index=True)

    return newdf
7
ответ дан euforia 17 August 2018 в 08:53
поделиться
  • 1
    Должно быть 2x-3x быстрее, если вы компилируете регулярное выражение перед циклом: regex = re.compile (regex), а затем, если regex.search (запись) – MarkokraM 10 April 2014 в 14:56
  • 2
    @MarkokraM docs.python.org/3.6/library/re.html#re.compile говорит, что самые последние регулярные выражения кэшируются для вас, поэтому вам не нужно компилировать себя. – Teepeemm 20 June 2018 в 19:36

Основываясь на проблеме github # 620 , похоже, что вы скоро сможете сделать следующее:

df[df['A'].str.contains("hello")]

Обновление: векторизованные строковые методы ( т.е. Series.str) доступны в pandas 0.8.1 и выше.

417
ответ дан hlin117 17 August 2018 в 08:53
поделиться
  • 1
    Это реализовано сейчас – Wes McKinney 8 August 2012 в 02:57
  • 2
    Как мы идем «Hello & quot; и "Британия" если я хочу найти их с "OR" состояние. – LonelySoul 27 June 2013 в 17:41
  • 3
    Поскольку методы str. * Обрабатывают шаблон ввода как регулярное выражение, вы можете использовать df[df['A'].str.contains("Hello|Britain")] – Garrett 27 June 2013 в 20:20
  • 4
    Можно ли преобразовать .str.contains в использование .query() api ? – zyxue 1 March 2017 в 18:25
  • 5
    df[df['value'].astype(str).str.contains('1234.+')] для фильтрации столбцов без строкового типа. – François Leblanc 13 February 2018 в 21:22

Как вы отфильтровываете «свободу», кроме как с такими критериями, как «наследие», «ulic» и т. д.

   df_Fixed[~df_Fixed["Busler Group"].map(lambda x: x.startswith('Liberty'))]
0
ответ дан jjaredrides 17 August 2018 в 08:53
поделиться

Скажите, что у вас есть DataFrame:

>>> df = pd.DataFrame([['hello', 'hello world'], ['abcd', 'defg']], columns=['a','b'])
>>> df
       a            b
0  hello  hello world
1   abcd         defg

Вы всегда можете использовать оператор in в выражении лямбда для создания вашего фильтра.

>>> df.apply(lambda x: x['a'] in x['b'], axis=1)
0     True
1    False
dtype: bool

Трюк здесь состоит в том, чтобы использовать опцию axis=1 в apply для передачи элементов в функцию лямбда по строкам, в отличие от столбца по столбцу.

20
ответ дан Mike 17 August 2018 в 08:53
поделиться
  • 1
    Как изменить выше, чтобы сказать, что x ['a'] существует только в начале x ['b']? – ComplexData 18 October 2016 в 20:23

Я использую pandas 0.14.1 на macos в ноутбуке ipython. Я попробовал предложенную строку выше:

df[df['A'].str.contains("Hello|Britain")]

и получил ошибку:

"cannot index with vector containing NA / NaN values"

, но она отлично работала, когда было добавлено условие «== Истина», например:

df[df['A'].str.contains("Hello|Britain")==True]
109
ответ дан sharon 17 August 2018 в 08:53
поделиться
  • 1
    Или вы можете сделать: df [df ['A']. Str.contains («Hello | UK», na = False)] – joshlk 2 July 2015 в 14:00

Если кто-нибудь задается вопросом, как выполнить связанную проблему: «Выбрать столбец частичной строкой»

Использовать:

df.filter(like='hello')  # select columns which contain the word hello

И выбирать строки путем частичного совпадения строк, передать axis=0 для фильтрации:

# selects rows which contain the word hello in their index label
df.filter(like='hello', axis=0)  
24
ответ дан user2285236 17 August 2018 в 08:53
поделиться
  • 1
    Это можно отделить до: df.loc[:, df.columns.str.contains('a')] – pshep123 17 June 2017 в 21:53
  • 2
    который может быть далее дистиллирован до df.filter(like='a') – Ted Petrou 25 October 2017 в 02:57
Другие вопросы по тегам:

Похожие вопросы: