Python将更新数据帧并计算更新的单元格数
假设我正在用另一个数据帧(df2)更新我的数据帧 是否有命令获取已更新的单元格数?(由Nan改为1)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
我想用它来跟踪对数据帧的更改。我想不出熊猫中有内置的方法,您必须在更新之前保存原始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