Pandas drop_duplicates Jupyter notebook 和 python 脚本之间无法一致地工作



我正在向现有数据帧添加条目,其中它们可以是新的,也可以是数据帧中现有条目的更新。较旧和过时的条目将使用 Pandas drop_duplicates从数据帧中删除,该条目在 Jupyter 笔记本中按预期工作:

df.drop_duplicates(keep = 'last', inplace = True, subset = ['col_a', 'col_b', ...])

但是,当我将代码传输到 python 脚本并通过 CLI 运行它时,重复/过时的条目不会被删除。

因此,我创建了另一个python脚本来加载带有重复/过时条目的数据帧,并执行上面的drop_duplicates代码。在这种情况下,代码有效。

知道这里发生了什么吗?谢谢!

使用 MVCE 进行更新:

我想我知道出了什么问题。这是一个示例代码来说明:

from datetime import datetime
import time
import pandas as pd
# sample dataframe
a = pd.DataFrame({
'date': ['2019-12-01', '2019W48', '2019-12-01', '2019-12-02'],
'value': [1, 2, 2, 3]
})
print('original df:')
print(a)
print('data type of dates of original df')
for i in range(0, len(a)):
print('{} - type = {}'.format(a.iloc[i,:]['date'], type(a.iloc[i,:]['date'])))
new_entry = [datetime.strptime("2019-12-02", '%Y-%m-%d').date(), 4]
a.loc[len(a)] = new_entry
print('updated df')
print(a)
print('data type of dates of updated df')
for i in range(0, len(a)):
print('{} - type = {}'.format(a.iloc[i,:]['date'], type(a.iloc[i,:]['date'])))
print('try to drop duplicates again')
b = a.drop_duplicates(keep = 'last', subset = ['date'], inplace = False)
print(b)

来自 CLI 的结果:

original df:
date  value
0  2019-12-01      1
1     2019W48      2
2  2019-12-01      2
3  2019-12-02      3
data type of dates of original df
2019-12-01 - type = <class 'str'>
2019W48 - type = <class 'str'>
2019-12-01 - type = <class 'str'>
2019-12-02 - type = <class 'str'>
updated df
date  value
0  2019-12-01      1
1     2019W48      2
2  2019-12-01      2
3  2019-12-02      3
4  2019-12-02      4
data type of dates of updated df
2019-12-01 - type = <class 'str'>
2019W48 - type = <class 'str'>
2019-12-01 - type = <class 'str'>
2019-12-02 - type = <class 'str'>
2019-12-02 - type = <class 'datetime.date'>
try to drop duplicates again
date  value
1     2019W48      2
2  2019-12-01      2
3  2019-12-02      3
4  2019-12-02      4

似乎日期类型需要相同才能drop_duplicates正常工作。所以下一步是将"日期"列转换为字符串,对吗?

感谢Kent Shikama的简短介绍。

根据我的发现,drop_duplicates似乎不起作用,因为其中一列中的数据类型混合在一起,在本例中为"日期"列。计算后,列中同时存在字符串条目和日期时间条目。因此,drop_duplicates没有立即对其进行处理。

重新加载相同的数据帧后,Python 似乎通过将日期时间条目自动转换为字符串来进行强制(有人可以确认这一点吗?因此,这就是drop_duplicates重新加载后工作的原因。

最新更新