Python Pandas - перезаписать x строк из другого фрейма данных условно

1

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

Таблица 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 и перезаписать

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]

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

   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?

образец:

    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 

выход

>>> 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"), :]

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

f = route_data.loc[route_data.circuit_type.str.contains("None"), :] = device_route_data
Теги:
pandas

1 ответ

2
Лучший ответ

Значения 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[], вы можете выбрать все столбцы, используя : не .loc[] их вручную. И вам не нужно также выбирать все столбцы из второго фреймворка данных - он будет использовать их по умолчанию.

Этот вопрос и ответ подобны этому: Pandas заменяет все элементы в строке NaN, если одно значение NaN.

  • 0
    я внес изменения в вопрос, мне кажется, что он не совсем подходит против None types
  • 0
    Является ли None строкой (то есть "None" ) в исходном фрейме данных или типом None ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню