在回答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.4874
更改为38.48742
我在这里错过了什么吗还是熊猫有错误吗?
答案 0 :(得分:1)
就像@ayhan一样,a
中的问题DataFrame是列latitude
和longitude
中的数字之间的字符串,因此所有列都强制转换为字符串。
在另一个DataFrame中,默认情况下将列强制转换为float
s。
一种可能的解决方案是将dtype
参数用于b
DataFrame:
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