Заменить содержимое всех ячеек, соответствующих условию - PullRequest
0 голосов
/ 31 декабря 2018

Как я могу перебрать весь фрейм данных, чтобы удалить данные в ячейках, которые содержат определенную строку, когда имена столбцов неизвестны?

Вот что у меня есть:

for (i in colnames(df)){
   df2 = df[~df[i].str.contains('found')]

Мои данные:

  Getting links from: https://www.bar.com/ Getting links from: https://www.boo.com/ Getting links from: https://www.foo.com/
0           ├───OK─── http://www.this.com/           ├───OK─── http://www.this.com/           ├───OK─── http://www.this.com/
1             ├───OK─── http://www.is.com/             ├───OK─── http://www.is.com/             ├───OK─── http://www.is.com/
2         ├─BROKEN─ http://www.broken.com/     2 links found. 0 excluded. 0 broken.         ├─BROKEN─ http://www.broken.com/
3                                      NaN                                      NaN            ├───OK─── http://www.set.com/
4                                      NaN                                      NaN            ├───OK─── http://www.one.com/

Как я могу удалить все содержимое ячейки, если она содержит строку, например, «найдено»?Я хочу удалить все в ячейке (в том числе до и после строки.)

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Поскольку вы ищете строку / значение для проверки и выполнения действия для всего DataFrame, следовательно, DataFrame.replace метод подходит здесь для предостережения ..

Пример DataFrame:

>>> df
      a
0  foo1
1  foo2
2   bar
3   bar
4   bar

Замена bar пробелом или вы можете заменить его на NaN Значение при желании:

>>> df.replace("bar", "", regex=True)
      a
0  foo1
1  foo2
2
3
4

Или заменить bar на NaN

>>> df.replace("bar", np.nan, regex=True)
 # df.replace("bar", np.nan, regex=True, inplace=True)
      a
0  foo1
1  foo2
2   NaN
3   NaN
4   NaN

Вы можете выбрать inplace=True, если хотите заменить на фактический фрейм данных:

Имитировать пример так:

>>> df
                                                                                                                         col1
0  Getting links from: https://www.bar.com/ Getting links from: https://www.boo.com/ Getting links from: https://www.foo.com/
1            ├───OK─── http://www.this.com/           ├───OK─── http://www.this.com/           ├───OK─── http://www.this.com/
2              ├───OK─── http://www.is.com/             ├───OK─── http://www.is.com/             ├───OK─── http://www.is.com/
3          ├─BROKEN─ http://www.broken.com/     2 links found. 0 excluded. 0 broken.         ├─BROKEN─ http://www.broken.com/
4                                       NaN                                      NaN            ├───OK─── http://www.set.com/
5                                       NaN                                      NaN            ├───OK─── http://www.one.com/

Результат с str.contains:

>>> df[~df["col1"].str.contains("found")]
                                                                                                                         col1
0  Getting links from: https://www.bar.com/ Getting links from: https://www.boo.com/ Getting links from: https://www.foo.com/
1            ├───OK─── http://www.this.com/           ├───OK─── http://www.this.com/           ├───OK─── http://www.this.com/
2              ├───OK─── http://www.is.com/             ├───OK─── http://www.is.com/             ├───OK─── http://www.is.com/
4                                       NaN                                      NaN            ├───OK─── http://www.set.com/
5                                       NaN                                      NaN            ├───OK─── http://www.one.com/

ИЛИ как указано, убедитесь, что значения имеют строковый тип для применения операции

>>> df[~df["col1"].astype(str).str.contains("found")]
0 голосов
/ 31 декабря 2018

Вы можете использовать applymap здесь:

import re    

# just make sure all values are string type
df = df.astype(str)    

# remove the text which has word found
df.applymap(lambda x: re.sub('.*found.*','',x ))

                                          0
0  Getting links from: https://www.boo.com/
1            ├───OK─── http://www.this.com/
2              ├───OK─── http://www.is.com/
3                                          
4                                       nan
5                                       nan
0 голосов
/ 31 декабря 2018

Вы можете заменить на nan с помощью df.replace ({'test': np.nan}), и это должно заменить все экземпляры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...