Python Pandas-有条件地覆盖另一个数据框中的x行

时间:2018-10-11 16:09:24

标签: python pandas

如果某列为空白,我想覆盖一个数据帧中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

1 个答案:

答案 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