【问题标题】:Looping through pandas rows循环遍历熊猫行
【发布时间】:2015-11-10 19:43:09
【问题描述】:

问题

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

             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),在循环顶部正确重置df=tr_df之后,它总是在drop_duplicates()之后转到(1, 3)

问题

问题出在哪里?如果我通过手动增加decimals 来运行脚本,我会得到正确的输出(对于实际数据):

(4, 3)
(138, 3)
(8858, 3)
...

【问题讨论】:

    标签: python loops for-loop pandas


    【解决方案1】:

    这里有几个问题。首先,你没有用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)
    

    【讨论】:

    • tr_df.copy()df = np.round(tr_df, decimals=i) 做到这一点。谢谢。这个np.round(df.iloc[:,1:], decimals=i) 起作用的原因是因为在我的实际数据中,我有三列[:,1:] 表示['X','Y']。我为这个问题删除了尽可能多的虚假信息,但我错过了。如果您查看我的问题中的df.shape,我有 3 列。
    • 好的,我对此有点困惑,但我并不介意。乐意效劳!压缩问题时要小心。
    猜你喜欢
    • 2021-12-18
    • 2020-11-20
    • 2014-09-08
    • 1970-01-01
    • 2017-06-08
    • 2017-01-15
    • 2020-03-06
    相关资源
    最近更新 更多