通过熊猫行循环

时间:2015-11-10 19:43:09

标签: python loops for-loop pandas

问题

我有一个坐标,我试图根据长/纬度精度减少行数。

             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" 

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)