如果某列为空白,我想覆盖一个数据帧中x个行,并且仅覆盖那些单行。我在下面的尝试会覆盖所有记录,似乎不仅仅是搜索中返回的记录
表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]
成功获取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()检查在无类型上也起作用?
样本:
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: []
>>>
编辑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
答案 0 :(得分: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[]
,因此可以使用:
选择所有列,而不必手动指定它们。而且您也不需要从第二个数据框中选择所有列-默认情况下将全部使用它们。
此问题和答案与以下内容类似:Pandas replace all items in a row with NaN if one value is NaN。