Python将更新数据帧并计算更新的单元格数

Python将更新数据帧并计算更新的单元格数,python,pandas,dataframe,Python,Pandas,Dataframe,假设我正在用另一个数据帧(df2)更新我的数据帧 是否有命令获取已更新的单元格数?(由Nan改为1) 我想用它来跟踪对数据帧的更改。我想不出熊猫中有内置的方法,您必须在更新之前保存原始df,然后进行比较,诀窍是确保NaN比较被视为非零值,这里df3是调用更新之前df的副本: In [104]: df.update(df2) df Out[104]: A B C D E axis1 A NaN NaN NaN

假设我正在用另一个数据帧(df2)更新我的数据帧

是否有命令获取已更新的单元格数?(由Nan改为1)
我想用它来跟踪对数据帧的更改。

我想不出熊猫中有内置的方法,您必须在更新之前保存原始df,然后进行比较,诀窍是确保
NaN
比较被视为非零值,这里df3是调用更新之前df的副本:

In [104]:

df.update(df2)
df
Out[104]:
         A   B   C   D   E
axis1                     
A      NaN NaN NaN NaN   1
Apple    1 NaN NaN   1   1
Linux    1   1   1 NaN   1
Unix     1   1 NaN   1   1
Window   1 NaN   1 NaN NaN

[5 rows x 5 columns]
In [105]:

df3
Out[105]:
         A   B   C   D   E
axis1                     
A      NaN NaN NaN NaN NaN
Apple    1 NaN NaN   1 NaN
Linux    1   1   1 NaN NaN
Unix     1   1 NaN   1 NaN
Window NaN NaN   1 NaN NaN

[5 rows x 5 columns]
In [106]:

# compare but notice that NaN comparison returns True
df!=df3
Out[106]:
            A      B      C      D     E
axis1                                   
A        True   True   True   True  True
Apple   False   True   True  False  True
Linux   False  False  False   True  True
Unix    False  False   True  False  True
Window   True   True  False   True  True

[5 rows x 5 columns]

In [107]:
# use numpy count_non_zero for easy counting, note this gives wrong result
np.count_nonzero(df!=df3)
Out[107]:
16

In [132]:

~((df == df3) | (np.isnan(df) & np.isnan(df3)))
Out[132]:
            A      B      C      D      E
axis1                                    
A       False  False  False  False   True
Apple   False  False  False  False   True
Linux   False  False  False  False   True
Unix    False  False  False  False   True
Window   True  False  False  False  False

[5 rows x 5 columns]
In [133]:

np.count_nonzero(~((df == df3) | (np.isnan(df) & np.isnan(df3))))
Out[133]:
5

我将此作为pandas的增强功能提交。我不确定为什么不在其中。@ccsv不知道,我从未想过需要此功能,但我可以看出为什么这会很有用,这会有问题,如果对更新dataframe/series/panel的所有方法都实施此功能,将导致性能下降。我想我的方法会根据这个生成一个副本:比较
NaN
是个问题,我用它来记录更改。我相信性能问题可能可以通过
cython
In [104]:

df.update(df2)
df
Out[104]:
         A   B   C   D   E
axis1                     
A      NaN NaN NaN NaN   1
Apple    1 NaN NaN   1   1
Linux    1   1   1 NaN   1
Unix     1   1 NaN   1   1
Window   1 NaN   1 NaN NaN

[5 rows x 5 columns]
In [105]:

df3
Out[105]:
         A   B   C   D   E
axis1                     
A      NaN NaN NaN NaN NaN
Apple    1 NaN NaN   1 NaN
Linux    1   1   1 NaN NaN
Unix     1   1 NaN   1 NaN
Window NaN NaN   1 NaN NaN

[5 rows x 5 columns]
In [106]:

# compare but notice that NaN comparison returns True
df!=df3
Out[106]:
            A      B      C      D     E
axis1                                   
A        True   True   True   True  True
Apple   False   True   True  False  True
Linux   False  False  False   True  True
Unix    False  False   True  False  True
Window   True   True  False   True  True

[5 rows x 5 columns]

In [107]:
# use numpy count_non_zero for easy counting, note this gives wrong result
np.count_nonzero(df!=df3)
Out[107]:
16

In [132]:

~((df == df3) | (np.isnan(df) & np.isnan(df3)))
Out[132]:
            A      B      C      D      E
axis1                                    
A       False  False  False  False   True
Apple   False  False  False  False   True
Linux   False  False  False  False   True
Unix    False  False  False  False   True
Window   True  False  False  False  False

[5 rows x 5 columns]
In [133]:

np.count_nonzero(~((df == df3) | (np.isnan(df) & np.isnan(df3))))
Out[133]:
5