python - pandas - drop_duplicates 没有按预期工作
问题描述
根据此处的答案,我正在尝试从一个数据框中删除其他数据框中存在的行。
它适用于这个输入:
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.4874
from38.48742
我在这里遗漏了什么还是熊猫有错误?
解决方案
就像@ayhan 评论的那样,DataFrame 中的问题是列和列中的a
数字之间的字符串,因此所有列都被转换为字符串。latitude
longitude
在另一个 DataFrame 中,默认情况下将列转换为float
s。
一种可能的解决方案是使用DataFrame的dtype
参数:b
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
或to_numeric
用于 中的列a
:
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
推荐阅读
- firebase - 使用 getDownloadUrl() 与公开对象有什么区别?
- security - macOS 小鸟应用程序文件显示在安全面板中?
- token - ETH 调用代币分配合约 - 汽油价格
- chatbot - 插槽可以在 RASA 中采用没有操作功能或表单的实体值吗?
- swift - 为什么我的 SwiftUI 列表选择在选择时没有突出显示?
- ios - 收藏视图更改后开始玩 Lottie
- python - Python:如何安装 utils.metrics 模块?
- python - 使用 python 下载 MEGA 文件时出现问题
- matplotlib - 使用圆形颜色图绘制热图
- python - 双向 LSTM Keras:传递了与“cell.state_size”不兼容的“initial_state”