问题
我有一个坐标,我试图根据长/纬度精度减少行数。
X Y
0 -122.425892 37.774599
1 -122.425892 37.774599
2 -122.424363 37.800414
3 -122.426995 37.800873
4 -122.438738 37.771541
如您所见,小数点数最多可达6个点。我拥有的数据大约是800k行。所以我创建了一个for循环来查看当我增加/减少小数点数时删除了多少行
解决方案尝试
tr_df = pd.read_csv('file.csv', usecols=['X', 'Y'])
for i in list(range(0,7)):
df = tr_df
df.iloc[:,1:] = np.round(df.iloc[:,1:], decimals=i)
df = df.drop_duplicates(['X','Y'])
print(df.shape)
这样做会打印(1, 3)
6次,这是不正确的。我在每一行之间添加了print(df.shape)
,在(1, 3)
之后,在drop_duplicates()
之后,在df=tr_df
正确重置后,它始终会转到decimals
。
问题
问题出在哪里?如果我通过手动增加(4, 3)
(138, 3)
(8858, 3)
...
运行脚本,我得到正确的输出(对于实际数据):
minSdkVersion 15
targetSdkVersion 23
compileSdkVersion 23
buildToolsVersion "23.0.1"
答案 0 :(得分:0)
这里有几个问题。首先,您没有使用df = tr_df
重置任何内容,而只是引用相同的对象。如果您需要制作副本,请使用df = tr_df.copy()
。
其次,使用df.iloc[:,1:] = np.round(df.iloc[:,1:], decimals=i)
,您只是围绕Y列。之后,您选择子集['X','Y']
来删除列,但由于X列尚未舍入,因此没有重复的行!
我不知道你如何“手动”得到正确的答案,但也许这就是你要找的东西(我添加了一个有用的印刷声明):
import numpy as np
import pandas as pd
tr_df = pd.read_csv('test.csv', usecols=['X', 'Y'])
for i in range(0,7):
df = np.round(tr_df, decimals=i)
df = df.drop_duplicates()
print df
print(df.shape)
输出:
X Y
0 -122 38
(1, 2)
X Y
0 -122.4 37.8
(1, 2)
X Y
0 -122.43 37.77
2 -122.42 37.80
3 -122.43 37.80
4 -122.44 37.77
(4, 2)
X Y
0 -122.426 37.775
2 -122.424 37.800
3 -122.427 37.801
4 -122.439 37.772
(4, 2)
X Y
0 -122.4259 37.7746
2 -122.4244 37.8004
3 -122.4270 37.8009
4 -122.4387 37.7715
(4, 2)
X Y
0 -122.42589 37.77460
2 -122.42436 37.80041
3 -122.42700 37.80087
4 -122.43874 37.77154
(4, 2)
X Y
0 -122.425892 37.774599
2 -122.424363 37.800414
3 -122.426995 37.800873
4 -122.438738 37.771541
(4, 2)