自定义值括号中的Python Groupby

时间:2018-09-17 08:02:41

标签: python pandas-groupby

我遇到一个与python groupby有关的问题。我在这里得到了这个数据框:

    latlong               hour  formula_value_x
0   -37.853698 145.0562584  0   978.880733
1   -37.853698 145.0562584  1   535.458975
2   -37.853698 145.0562584  2   370.082577
3   -37.853698 145.0562584  3   348.519570
4   -37.853698 145.0562584  4   524.588282
5   -37.853698 145.0562584  5   1310.520435
6   -37.853698 145.0562584  6   3440.724656
7   -37.853698 145.0562584  7   5839.008447
8   -37.853698 145.0562584  8   6024.170196
9   -37.853698 145.0562584  9   5000.579879
10  -37.853698 145.0562584  10  4697.686943

我需要在1st 2列(groupbylatlong)上运行hours并找到最大值。但是我需要在0-5, 6-10, 11-16,17-20, 20-23之类的小时数上按小时运行groupby。

 df1.groupby(['latlong','hour'])['formula_value_x'].quantile(1) 

是不带括号的基本方法。我该如何用这些小时数来做?

因此,例如对于特定的latlong值,groupby将在小时[0,1,2,3,4,5]内使用其所有公式值,然后采用其最大值。 在找到此类小时数的最大值之后,我需要创建一个具有最大值(先前已找到)的新列,这些列将位于属于同一时间段的小时数旁边。

所以..我需要这样的结果:

    latlong               hour  formula_value_x    max
0   -37.853698 145.0562584  0   978.880733        1310.520435
1   -37.853698 145.0562584  1   535.458975        1310.520435
2   -37.853698 145.0562584  2   370.082577        1310.520435
3   -37.853698 145.0562584  3   348.519570        1310.520435
4   -37.853698 145.0562584  4   524.588282        1310.520435
5   -37.853698 145.0562584  5   1310.520435       1310.520435
6   -37.853698 145.0562584  6   3440.724656       6024.170196
7   -37.853698 145.0562584  7   5839.008447       6024.170196 
8   -37.853698 145.0562584  8   6024.170196       6024.170196
9   -37.853698 145.0562584  9   5000.579879       6024.170196
10  -37.853698 145.0562584  10  4697.686943       6024.170196

1 个答案:

答案 0 :(得分:0)

一种简单的方法是将小时分组到新的“小时组”列中,并进行处理。

df.loc[df.hour.isin([0, 1, 2, 3, 4, 5]), 'hourgroup'] = 'HG1'
df.loc[df.hour.isin([6, 7, 8]), 'hourgroup'] = 'HG2'
....

然后在新的数据框中收集分组的值。我将纬度/经度分为两个字段,因为示例中的空格会在导入时将其拆分。

df2 = df.groupby(['lat', 'long', 'hourgroup'])['formula_value_x'].max().reset_index()

为分组的最大值赋予更好的名称。 Max是一个不好的名字,因为函数max存在。

df2.rename(columns={'formula_value_x': 'max_value_x'}, inplace=True)

将其与原始数据框合并

df_result = df.merge(df2, on=['lat', 'long', 'hourgroup'], how='left')

print(df_result)