Python Pandas - перезаписать x строк из другого фрейма данных условно - PullRequest
0 голосов
/ 11 октября 2018

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

Таблица 1

>>> route_data
   circuit_id circuit_provider circuit_type   down errors        route            site  site_id           mask       next_hop
0        None              BOB         MPLS  False   None   10.10.94.0           HORSE        7  255.255.255.0    172.10.1.25
1        None              BOB         MPLS  False   None   10.10.82.0          LONDON        8  255.255.255.0    172.10.1.25
2        None             BILL         MPLS  False   None   10.10.25.0           BACON      128  255.255.255.0     172.1.1.21
3        None             BILL         MPLS  False   None    10.11.0.0            MANC        1    255.255.0.0            NaN
4        None              BOB         MPLS  False   None   10.10.66.0            YORK        9  255.255.255.0    172.10.1.25
5        None              BOB         MPLS  False   None   10.10.87.0           LIVER       10  255.255.255.0    172.10.1.25
6        None              BOB         MPLS  False   None  10.10.120.0            EGGS       11  255.255.255.0    172.10.1.25

Таблица 2

>>> device_route_data
   circuit_id circuit_provider circuit_type   down errors        route            site  site_id           mask       next_hop
0        None              BOB         MPLS  False   None   10.10.94.0           HORSE        7  255.255.255.0     172.17.5.1
1        None              BOB         MPLS  False   None   10.10.82.0          LONDON        8  255.255.255.0     172.17.5.1
2        None             BILL         MPLS  False   None   10.10.25.0           BACON      128  255.255.255.0   172.16.30.10
3        None             BILL         MPLS  False   None    10.11.0.0            MANC        1    255.255.0.0   172.16.30.10
4        None              BOB         MPLS  False   None   10.10.66.0            YORK        9  255.255.255.0     172.17.5.1
5        None              BOB         MPLS  False   None   10.10.87.0           LIVER       10  255.255.255.0     172.17.5.1
6        None              BOB         MPLS  False   None  10.10.120.0            EGGS       11  255.255.255.0     172.17.5.1

получить все записи Nan иoverwrite

route_data.loc[route_data.next_hop.str.match('nan'), route_data.columns] = device_route_data[device_route_data.columns]

просто возвращает данные таблицы 2 полностью

   circuit_id circuit_provider circuit_type   down errors        route            site  site_id           mask       next_hop
0        None              BOB         MPLS  False   None   10.10.94.0           HORSE        7  255.255.255.0     172.17.5.1
1        None              BOB         MPLS  False   None   10.10.82.0          LONDON        8  255.255.255.0     172.17.5.1
2        None             BILL         MPLS  False   None   10.10.25.0           BACON      128  255.255.255.0   172.16.30.10
3        None             BILL         MPLS  False   None    10.11.0.0            MANC        1    255.255.0.0   172.16.30.10
4        None              BOB         MPLS  False   None   10.10.66.0            YORK        9  255.255.255.0     172.17.5.1
5        None              BOB         MPLS  False   None   10.10.87.0           LIVER       10  255.255.255.0     172.17.5.1
6        None              BOB         MPLS  False   None  10.10.120.0            EGGS       11  255.255.255.0     172.17.5.1    

, используя

route_data.loc[route_data.next_hop.str.match('nan'), route_data.columns]

Успешно получает записи Nan

   circuit_id circuit_provider circuit_type   down errors        route            site  site_id           mask       next_hop
3        None             BILL         MPLS  False   None    10.11.0.0            MANC        1    255.255.0.0            NaN

это единственная запись, которую я хочу перезаписать, хотя, я хочу, чтобы все остальные остались такими, как есть, кто-нибудь знает, что мне не хватает?

Спасибо

РЕДАКТИРОВАТЬ:

Я пытаюсь сделать то же самое для circuit_type, но получаю пустые результаты.проверка .isnull () также работает на None Types?

sample:

    circuit_id circuit_provider circuit_type   down errors        route            site  site_id           mask      next_hop
0        None              BOB         MPLS  False   None   10.10.94.0           HORSE        7  255.255.255.0     172.17.5.1
1        None              BOB         MPLS  False   None   10.10.82.0          LONDON        8  255.255.255.0     172.17.5.1
2        None             BILL         MPLS  False   None   10.10.25.0           BACON      128  255.255.255.0   172.16.30.10
3        None             BILL         MPLS  False   None    10.11.0.0            MANC        1    255.255.0.0   172.16.30.10
4        None              BOB         MPLS  False   None   10.10.66.0            YORK        9  255.255.255.0     172.17.5.1
5        None              None        None  False   None   10.10.87.0           LIVER       10  255.255.255.0     172.17.5.1
6        None              BOB         MPLS  False   None  10.10.120.0            EGGS       11  255.255.255.0     172.17.5.1 

output

>>> route_data.loc[route_data.circuit_type.isnull(), :]
Empty DataFrame
Columns: [circuit_id, circuit_provider, circuit_type, down, errors, route, site, site_id, mask, next_hop]
Index: []
>>>

EDIT 2: дальнейшее тестирование, это работает для поискастроки

route_data.loc[route_data.circuit_type.str.contains("None"), :]

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

f = route_data.loc[route_data.circuit_type.str.contains("None"), :] = device_route_data

1 Ответ

0 голосов
/ 11 октября 2018

Значения next_hop, которые вы пытаетесь выбрать, - это не строка "nan", а специальное значение, известное как "не число" или NaN (обратите внимание на смешанную заглавную букву).Панды имеют удобные функции для работы с NaN и другими нулевыми значениями, такими как isnull():

df1.loc[df.some_column.isnull(), :] = df2

С вашими именами:

route_data.loc[route_data.next_hop.isnull(), :] = device_route_data

isnull() изолирует строки со значениями NaN в интересующей вас колонке.Поскольку вы используете .loc[], вы можете выбрать все столбцы, используя :, без необходимости указывать их вручную.И вам не нужно выбирать все столбцы во втором кадре данных - он будет использовать их по умолчанию.

Этот вопрос и ответ похож на этот: Панды заменяют все элементы встрока с NaN, если одно значение NaN .

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