【问题标题】:Python : Group rows in dataframe and select abs max value in groups using pandas groupbyPython:对数据框中的行进行分组,并使用 pandas groupby 在组中选择绝对最大值
【发布时间】:2017-05-12 11:17:11
【问题描述】:

我正在寻找以下问题的解决方案:

我有一个 pandas 数据框(0.12.0 版),例如:

df = pd.DataFrame({
    'Time' : [0.0, 0.0, 0.1, 0.2],
    'Signal_1' : [0, 1, 0, 3],
    'Signal_2' : [1, -1.5, -3, 0],        
    })
>>> print df

   Signal_1  Signal_2  Time
0         0       1.0   0.0
1         1      -1.5   0.0
2         0      -3.0   0.1
3         3       2.0   0.2

现在,我使用 groupby 合并具有相同时间戳的行(在本例中为第一行和第二行)。但是合并的行应该获得该组的绝对最大值。所以,我正在寻找一个函数 absmax() 来获取以下分组数据帧:

>>> df = df.groupby('Time').absmax()
   Signal_1  Signal_2  Time
0         1      -1.5   0.0
1         0      -3.0   0.1
2         3       2.0   0.2

编辑:谢谢 ;-)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你真的很亲密 - 需要 idxmax 索引:

    df = df.loc[df.groupby('Signal_1')['Time'].idxmax()]
    print (df)
       Signal_1  Signal_2  Time
    2         0      -3.0   0.1
    1         1      -1.5   0.0
    3         3       2.0   0.2
    

    或者可能需要:

    df = df.loc[df.groupby('Time')['Time'].apply(lambda x: x.abs().idxmax())]
    print (df)
       Signal_1  Signal_2  Time
    0         0       1.0   0.0
    2         0      -3.0   0.1
    3         3       2.0   0.2
    

    或者:

    df = df.loc[df.groupby('Time')['Time'].idxmax()]
    print (df)
       Signal_1  Signal_2  Time
    0         0       1.0   0.0
    2         0      -3.0   0.1
    3         3       2.0   0.2
    

    【讨论】:

    • 很高兴能帮上忙,美好的一天!
    • 当然,没问题。
    • 编辑:我的数据框包括 NaN。 df = df.loc[df.groupby('Time')['Time'].idxmax()] 采用 NaN 而不是“真实”值。如何解决这个问题? :-)
    • 嗯,之前可以删除NaN 吗? df = df.dropna(subset=['Time'])df = df.loc[df.groupby('Signal_1')['Time'].idxmax()]。测试于df = pd.DataFrame({ 'Time' : [np.nan, 0.0, 0.1, np.nan], 'Signal_1' : [0, 1, 0, 3], 'Signal_2' : [1, -1.5, -3, 0], })
    • 无法使用 dropna 删除 NaN 或将其替换为其他值。 dropna 删除包含 NaN 的完整行。我还尝试df = df.fillna(method='ffill') 用“最后一个已知值”替换 NaN,但这也可能导致功能错误。例如。 df = pd.DataFrame({ 'Time' : [0.0, 0.1, 0.1, 0.2], 'Signal_1' : [2, np.nan, 1, 0]})df = df.loc[df.groupby('Time')['Time'].idxmax()] 在 0.1 处 Signal_1 的结果值为 2,而不是“真实”值 1。:-/
    猜你喜欢
    • 2020-04-20
    • 2017-12-30
    • 2018-07-04
    • 2021-06-03
    • 2020-08-14
    • 2021-12-22
    • 1970-01-01
    • 2022-11-27
    • 2022-12-09
    相关资源
    最近更新 更多