【问题标题】:Effciency: Dropping rows with the same timestamp while still having the median of second column for that timestamp效率:删除具有相同时间戳的行,同时仍然具有该时间戳的第二列的中值
【发布时间】:2019-11-22 09:10:10
【问题描述】:

我想做的事: 列“角度”每秒跟踪大约 20 个角度(可能会有所不同)。但是我的“时间”时间戳只有 1 秒的精度(因此总是大约 20 行具有相同的时间戳)(数据帧中的总行数超过 100 万)。 我的结果将是一个新的数据框,每行的时间戳都在变化。时间戳的角度应为该区间内约 20 个时间戳的中位数。

我的想法: 我遍历行并检查时间戳是否已更改。 如果是这样,我会选择所有时间戳,直到它发生变化,计算中位数,并将其附加到新的数据帧中。 尽管如此,我有很多大数据文件,我想知道是否有更快的方法来实现我的目标。

现在我的代码如下(见下文)。 它并不快,我认为必须有更好的方法来使用 pandas/numpy(或其他东西?)。

a = 0
for i in range(1,len(df1.index)):
    if df1.iloc[[a],[1]].iloc[0][0]==df1.iloc[[i],[1]].iloc[0][0]:
        continue
    else:
        if a == 0:
            df_result = df1[a:i-1].median()
        else:
            df_result = df_result.append(df1[a:i-1].median(), ignore_index = True)
    a = i

【问题讨论】:

    标签: python pandas numpy bigdata


    【解决方案1】:

    您可以在此处使用groupby。下面,我做了一个简单的虚拟数据框。

    import pandas as pd
    df1 = pd.DataFrame({'time': [1,1,1,1,1,1,2,2,2,2,2,2],
                       'angle' : [8,9,7,1,4,5,11,4,3,8,7,6]})
    
    df1
    
      time  angle
    0   1   8
    1   1   9
    2   1   7
    3   1   1
    4   1   4
    5   1   5
    6   2   11
    7   2   4
    8   2   3
    9   2   8
    10  2   7
    11  2   6
    

    然后,我们按时间戳分组,取该组内角度列的中值,并将结果转换为 pandas 数据帧。

    df2 =  pd.DataFrame(df1.groupby('time')['angle'].median())
    df2 = df2.reset_index()
    df2
    
        time angle
    0   1     6.0
    1   2     6.5
    

    【讨论】:

      【解决方案2】:

      可以使用.agg分组后功能按列选择操作

      df1.groupby('Time', as_index=False).agg({"angle":"median"})
      

      【讨论】:

        猜你喜欢
        • 2016-05-18
        • 2020-10-18
        • 1970-01-01
        • 2022-10-26
        • 2016-12-27
        • 2020-07-07
        • 2016-10-14
        • 1970-01-01
        • 2018-01-19
        相关资源
        最近更新 更多