Я хотел бы переписать х число строк из фрейма данных, если определенный столбец пуст и только перезаписать эти отдельные строки. мои попытки ниже перезаписывать все записи, кажется, не только те, что были возвращены в поиске
Таблица 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
Значения 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.
None
строкой (то есть"None"
) в исходном фрейме данных или типомNone
?