我遇到一个与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列(groupby
和latlong
)上运行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
答案 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)