【问题标题】:inserting row with values at certain index taking too long在某个索引处插入具有值的行需要太长时间
【发布时间】:2019-11-18 01:23:58
【问题描述】:

我有下表:

+-------------------------------------------------------+
| CarID  CarNumber   GPS     DateTime             Speed |
+-------------------------------------------------------+
| WFV303   303      104:58  04.02.2019 10:10:51    21   |
| WFV303   303      104:58  04.02.2019 10:10:54    23   |
| WFV303   303      104:58  04.02.2019 10:10:59    23   |
| WFV303   303      104:58  04.02.2019 10:11:01    24   |
| FBV404   404      105:59  04.02.2019 12:10:20    19   |
| FBV404   404      105:59  04.02.2019 12:10:25    19   |
+-------------------------------------------------------+

如果 CarNumber 中的 i+1 不等于 i,我想插入零值的行,所以我看起来像这样:

+-------------------------------------------------------+
| CarID  CarNumber   GPS     DateTime             Speed |
+-------------------------------------------------------+
| WFV303   303      104:58  04.02.2019 10:10:51    21   |
| WFV303   303      104:58  04.02.2019 10:10:54    23   |
| WFV303   303      104:58  04.02.2019 10:10:59    23   |
| WFV303   303      104:58  04.02.2019 10:11:01    24   |
| 0        0        0       0                      0    |
| FBV404   404      105:59  04.02.2019 12:10:20    19   |
| FBV404   404      105:59  04.02.2019 12:10:25    19   |
+-------------------------------------------------------+

我尝试了以下方法:

for i in range(len(df['CarNumber'])):
    if df['CarNumber'].iloc[i]!=df['CarNumber'].iloc[i+1]:
        zero_row = pd.DataFrame({"CarNumber":0,"DateTime": 0}, index=[i+0.5])
        df = df.append(zero_row, ignore_index=False)
        df = df.sort_index().reset_index(drop=True)

我没有收到任何错误,但它需要很长时间才能处理并且永远不会完成(我的 csv 文件约为 50 mb)。

我该怎么办?有没有更有效的方法?

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用groupby。这至少应该比遍历所有行更有效。

    
    df = pd.DataFrame({'CarNumber': [303] * 4 + [404] * 2 + [405] * 5,
                       'othercol': range(11)})
    
    def zero_row(cols, idx):
        return pd.DataFrame([[0] * len(cols)], columns=cols, index=[idx])
    
    def add_zero_row(x):
        return x.append(zero_row(x.columns, x.index.max() + 0.5))
    
    df = df.groupby('CarNumber').apply(add_zero_row)
    
    # remove extra index from grouping
    df = df.reset_index('CarNumber', drop=True)
    
    # get rid of last zero row
    df.iloc[:-1]
    

    【讨论】:

    • 太棒了,正是我要找的,花了 5 秒谢谢!
    • 但是,插入零行来标记组听起来有些不寻常...请问您使用它的目的是什么,接下来的步骤是什么?
    • 然后我找到每辆车的时间增量,看看它在某个位置花费了多少时间。我添加这些零值行的原因是,例如,当我从 303 号车移动到 404 号车时,404 号车的开始时间增量将考虑到 303 号车的结束时间,这是错误的。也许还有其他方法可以解决这个问题?
    • 刚刚注意到,它没有考虑日期。例如,从 2019-02-04 到 2019-02-05 的汽车日志将给出较大的时间增量,因为日期不同但汽车相同。我也按日期分组吗?
    • 您正在分别查看每辆车。在这种情况下,您可能应该开车使用groupby(甚至可能按位置)并直接在应用于组的函数中计算时差(如我的回答中的add_zero_row)。或者,如果我正确理解您的问题,您甚至可以这样做:df.pivot_table(index=['CarNumber', 'GPS'], values='DateTime', aggfunc=[min, max]).diff(axis=1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2017-01-18
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多