Python:在数据框中对行进行分组,并使用pandas groupby在组中选择abs max值

时间:2017-05-12 11:17:12

标签: python pandas dataframe

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

我有一个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

编辑:谢谢; - )

2 个答案:

答案 0 :(得分:2)

你真的很接近 - 索引需要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

答案 1 :(得分:0)

感谢@jezrael的答案。

上下文是:我想合并(append)两个或更多个具有不同采样时间的数据帧。

df1 = pd.DataFrame({
     'Time' : [0.0, 0.1, 0.2],
     'Signal_1' : [0, 1, 2],        
     })

df2 = pd.DataFrame({
     'Time' : [0.0, 0.1],
     'Signal_2' : [-1.5, -3],        
     })    

df = df1.append([df2], ignore_index=True)
df = df.sort(['Time'])

结果是以下数据帧:

   Signal_1  Signal_2  Time
0         0       NaN   0.0
3       NaN      -1.5   0.0
1         1       NaN   0.1
4       NaN      -3.0   0.1
2         2       NaN   0.2

问题是,df = df.loc[df.groupby('Time')['Time'].idxmax()]获取Signal_1中最大值的索引:

   Signal_1  Signal_2  Time
0         0       NaN   0.0
1         1       NaN   0.1
2         2       NaN   0.2

所需的数据框应如下所示:

   Signal_1  Signal_2  Time
0         0      -1.5   0.0
1         1      -3.0   0.1
2         2       NaN   0.2

请分享您的解决方案: - )