Python pandas-drop_副本未按预期工作
根据中的回答,我试图从一个数据帧中删除另一个数据帧中存在的行 它适用于此输入: csv1: csv2: 代码: 这是预期的工作。但一旦在第一个csv中有更多的行,它就不起作用了Python pandas-drop_副本未按预期工作,python,pandas,python-2.7,csv,Python,Pandas,Python 2.7,Csv,根据中的回答,我试图从一个数据帧中删除另一个数据帧中存在的行 它适用于此输入: csv1: csv2: 代码: 这是预期的工作。但一旦在第一个csv中有更多的行,它就不起作用了 场景2在csv1中有额外的行 csv1: csv2: 代码: 请注意,它还将合并行中第二个副本的纬度值从38.48742更改为38.4874 我是这里遗漏了什么还是熊猫有错误?像@ayhan评论的那样,a数据帧是列纬度和经度之间的字符串,所以所有列都被转换为字符串 在另一个数据帧中,默认情况下列被转换为floats 一
场景2在csv1中有额外的行 csv1: csv2: 代码: 请注意,它还将合并行中第二个副本的纬度值从
38.48742
更改为38.4874
我是这里遗漏了什么还是熊猫有错误?像@ayhan评论的那样,
a
数据帧是列纬度和经度之间的字符串,所以所有列都被转换为字符串
在另一个数据帧中,默认情况下列被转换为float
s
一种可能的解决方案是为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
中的列:
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
我现在无法运行python,但有趣的是,在concat
中b
的latitude
被截断为38.4874
。因此,它与早期版本的38.48742
不匹配row@Jondiedoop是的,甚至我也注意到了这一点,并交叉检查了csv中的值。它确实是截断np.NaN==np.NaN是错误的,因此您可能可以用某个常量替换NaN值,然后执行drop\u duplicate操作……我想知道索引2的非数值是否与此有关。你能在所有情况下添加latitude
列的dtypes
吗?很好的捕获@Jondiedoop。这就是问题所在。谢谢你。有没有办法让每一列的数据类型都变成str?我真的不在乎dtypes@MohitC-然后使用a=pd.read\u csv('../test.csv',escapechar='\\',dtype={'latitude':str,'longitude':str})
这就是我要问的,有没有办法将所有列的dtype指定为str作为单个参数?@MohitC-当然,使用a=pd.read\u csv('../test.csv',escapechar='\\\',dtype=str)
>>> 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
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
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
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['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