如何计算分组在另一栏熊猫的平均值

对于下列数据框架:

StationID  HoursAhead    BiasTemp
SS0279           0          10
SS0279           1          20
KEOPS            0          0
KEOPS            1          5
BB               0          5
BB               1          5

我想要这样的东西:

StationID  BiasTemp
SS0279     15
KEOPS      2.5
BB         5

我知道我可以编写这样的脚本来获得预期的结果:

def transform_DF(old_df,col):
list_stations = list(set(old_df['StationID'].values.tolist()))
header = list(old_df.columns.values)
header.remove(col)
header_new = header
new_df = pandas.DataFrame(columns = header_new)
for i,station in enumerate(list_stations):
general_results = old_df[(old_df['StationID'] == station)].describe()
new_row = []
for column in header_new:
if column in ['StationID']:
new_row.append(station)
continue
new_row.append(general_results[column]['mean'])
new_df.loc[i] = new_row
return new_df

但是我想知道熊猫身上是否有更直接的东西。

112340 次浏览

这就是 groupby的作用:

In [117]:
df.groupby('StationID')['BiasTemp'].mean()


Out[117]:
StationID
BB         5.0
KEOPS      2.5
SS0279    15.0
Name: BiasTemp, dtype: float64

在这里,我们按“ StationID”列分组,然后访问“ BiasTemp”列并对其调用 mean

医生中有一个关于此功能的章节。

你可以在 StationID上使用 groupby,然后在 BiasTemp上使用 mean()。要输出 Dataframe,使用 as_index=False

In [4]: df.groupby('StationID', as_index=False)['BiasTemp'].mean()
Out[4]:
StationID  BiasTemp
0        BB       5.0
1     KEOPS       2.5
2    SS0279      15.0

如果没有 as_index=False,则返回一个 Series

In [5]: df.groupby('StationID')['BiasTemp'].mean()
Out[5]:
StationID
BB            5.0
KEOPS         2.5
SS0279       15.0
Name: BiasTemp, dtype: float64

在这个 pydata 教程中阅读更多关于 groupby的内容。

可以这样做:

df.groupby('StationID').mean()