【问题标题】:pandas - drop_duplicates not working as expectedpandas - drop_duplicates 没有按预期工作
【发布时间】:2019-09-06 07:07:45
【问题描述】:

根据here 的回答,我正在尝试从一个数据帧中删除其他数据帧中存在的行。

这个输入很好用:

csv1:

sale_date,price,latitude,longitude
Wed May 21 00:00:00 EDT 2008,141000,38.423251,-121.444489
Wed May 21 00:00:00 EDT 2008,146250,38.48742

csv2:

sale_date,price,latitude,longitude
Wed May 21 00:00:00 EDT 2008,146250,38.48742

代码:

>>> a = pd.read_csv('../test.csv', escapechar='\\')
>>> a
                      sale_date   price   latitude   longitude
0  Wed May 21 00:00:00 EDT 2008  141000  38.423251 -121.444489
1  Wed May 21 00:00:00 EDT 2008  146250  38.487420         NaN

>>> b = pd.read_csv('../test1.csv', escapechar='\\')
>>> b
                      sale_date   price  latitude  longitude
0  Wed May 21 00:00:00 EDT 2008  146250  38.48742        NaN

>>> pd.concat([a,b]).drop_duplicates(keep=False)
                      sale_date   price   latitude   longitude
0  Wed May 21 00:00:00 EDT 2008  141000  38.423251 -121.444489

这是按预期工作的。但是一旦第一个 csv 中还有其他行,它就不起作用了。


场景 2 在 csv1 中有额外的行

csv1:

sale_date,price,latitude,longitude
Wed May 21 00:00:00 EDT 2008,141000,38.423251,-121.444489
Wed May 21 00:00:00 EDT 2008,146250,38.48742
Wed May 21 00:00:00 EDT 2008,147308,38.658246a,-121.375469a

csv2:

sale_date,price,latitude,longitude
Wed May 21 00:00:00 EDT 2008,146250,38.48742

代码:

>>> a = pd.read_csv('../test.csv', escapechar='\\')
>>> a
                      sale_date   price    latitude     longitude
0  Wed May 21 00:00:00 EDT 2008  141000   38.423251   -121.444489
1  Wed May 21 00:00:00 EDT 2008  146250    38.48742           NaN
2  Wed May 21 00:00:00 EDT 2008  147308  38.658246a  -121.375469a

>>> b = pd.read_csv('../test1.csv', escapechar='\\')
>>> b
                      sale_date   price  latitude  longitude
0  Wed May 21 00:00:00 EDT 2008  146250  38.48742        NaN

>>> pd.concat([a,b]).drop_duplicates(keep=False)
                      sale_date   price    latitude     longitude
0  Wed May 21 00:00:00 EDT 2008  141000   38.423251   -121.444489
1  Wed May 21 00:00:00 EDT 2008  146250    38.48742           NaN
2  Wed May 21 00:00:00 EDT 2008  147308  38.658246a  -121.375469a
0  Wed May 21 00:00:00 EDT 2008  146250     38.4874           NaN

请注意,它还将合并行中第二个重复的纬度值从 38.48742 更改为 38.4874

我在这里遗漏了什么还是熊猫有错误?

【问题讨论】:

  • 我现在无法运行python,但有趣的是,在concat 中,blatitude 被截断为38.4874。因此,它与前一行的38.48742 不匹配
  • @Jondiedoop 是的,即使我注意到了这一点并交叉检查了 csv 中的值。它确实在截断
  • np.NaN == np.NaN 为 False,因此您可能可以将 NaN 值替换为某个常数,然后 drop_duplicate 可能会起作用...
  • 我想知道索引 2 的非数字值是否与它有关。你能在所有情况下都添加latitude 列的dtypes 吗?
  • 不错的收获@Jondiedoop。这就是问题所在。谢谢

标签: python pandas python-2.7 csv


【解决方案1】:

就像@ayhan 评论的那样,a 中存在问题,DataFrame 是列latitudelongitude 中的数字之间的字符串,因此所有列都转换为字符串。

在另一个 DataFrame 中,列默认转换为 floats。

一种可能的解决方案是为b DataFrame 使用dtype 参数:

b = pd.read_csv('../test1.csv', escapechar='\\', dtype={'latitude':str, 'longitude':str})

df = pd.concat([a,b]).drop_duplicates(keep=False)
print (df)
                      sale_date   price    latitude     longitude
0  Wed May 21 00:00:00 EDT 2008  141000   38.423251   -121.444489
2  Wed May 21 00:00:00 EDT 2008  147308  38.658246a  -121.375469a

或者对a 中的列使用to_numeric

a['latitude'] = pd.to_numeric(a['latitude'], errors='ignore')
a['longitude'] = pd.to_numeric(a['longitude'], errors='ignore')
df = pd.concat([a,b]).drop_duplicates(keep=False)
print (df)
                      sale_date   price    latitude     longitude
0  Wed May 21 00:00:00 EDT 2008  141000   38.423251   -121.444489
2  Wed May 21 00:00:00 EDT 2008  147308  38.658246a  -121.375469a

【讨论】:

  • 感谢。有没有办法让我把每一列的 dtype 设为 str?我真的不在乎 dtypes
  • @MohitC - 然后使用a = pd.read_csv('../test.csv', escapechar='\\', dtype={'latitude':str, 'longitude':str})
  • 这就是我要问的,有没有办法将所有列的 dtype 指定为 str 作为单个参数?
  • @MohitC - 当然,使用a = pd.read_csv('../test.csv', escapechar='\\', dtype=str)
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 2020-03-18
  • 2012-06-14
  • 2014-11-15
  • 1970-01-01
  • 2012-07-02
  • 2011-09-07
  • 2013-03-03
相关资源
最近更新 更多