查找行和列组熊猫的平均值

时间:2019-06-23 19:45:22

标签: python pandas

我想找到平均总收入最高的州,并能够看到1992-2016年所有州的平均总收入最高的州(第40-45位),第35-40位(等等)。

数据在下图中的数据框中组织。因此,理想情况下,我可以有另一列如下所示。我认为这就是我想要做的。

STATE // YEAR // TOTAL_REVENUE // AVG_TOTAL_REVENUE

ALABAMA // 1992 // 5000 // 6059

ALABAMA // 1993 // 4000 // 6059

ALASKA // 1992 // 3000 // 2059

ALABAMA // 1996 // 6019 // 6059

enter image description here

这有可能吗?我不确定我是否要说出我想正确做的事情,也不确定我在寻找谷歌明智的方法以找出前进的方向。

2 个答案:

答案 0 :(得分:4)

假设您输入的内容如下:

STATE       YEAR    TOTAL_REVENUE
Michigan    2001    1000
Michigan    2002    2000
California  2003    3000
California  2004    4000
Michigan    2005    5000

然后就做:

df['AVG_TOTAL_REVENUE'] = np.nan

states = df['STATE'].tolist()
states = list(set(states))

for state in states:
    state_values = df[df['STATE'] == state]
    revenues = state_values['TOTAL_REVENUE'].tolist()
    revenues = [float(x) for x in revenues]
    avg = sum(revenues)/len(revenues)
    df['AVG_TOTAL_REVENUE'].loc[state_values.index] = avg

为您提供:

     STATE     YEAR       TOTAL_REVENUE  AVG_TOTAL_REVENUE
0    Michigan  2001           1000        2666.666667
1    Michigan  2002           2000        2666.666667
2  California  2003           3000        3500.000000
3  California  2004           4000        3500.000000
4    Michigan  2005           5000        2666.666667

答案 1 :(得分:0)

如果您的数据存储在以STATE为索引的名为df的熊猫数据框中,则可以尝试:

df.set_index("STATE",inplace=True)
avg_revenue = df.groupby(level=0)["TOTAL_REVENUE"].agg("mean")
df["AVG_TOTAL_REVENUE"] = avg_revenue.loc[df.index]
df = df.sort_values(by="AVG_TOTAL_REVENUE",ascending=False)

关于“第40至45个最高平均值”,我不确定您要寻找的是什么。但是您可以这样做:

import numpy as np

bin = (np.array([0.40, 0.45]) * len(df)).astype(int)

df.iloc[bin[0]:bin[1],:]

# Or with quantiles
min_q,max_q = (0.40, 0.45)
avg = df.AVG_TOTAL_REVENUE

df.loc[(avg >= avg.quantile(min_q)) & (avg <= avg.quantile(max_q)), :]

或者您可能想按AVG_TOTAL_REVENUE的顺序每5个状态对数据进行装箱?

df_grouped = df.groupby("STATE")["AVG_TOTAL_REVENUE"].agg("first")
n_bins = int(df_grouped.shape[0] / 5)

bins = (pd.cut(df_grouped,bins=n_bins)
    .reset_index()
    .groupby("AVG_TOTAL_REVENUE")
    .agg(list)
)