查找行和列组的平均值

2024-04-18 01:58:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找到平均总收入最高的州,并且能够看到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

这有可能吗?我不知道我是否陈述了我想做的正确,也不知道我在寻找谷歌智慧找出前进的道路。你知道吗


Tags: 数据情况yearavgtotalstate理想道路
2条回答

如果您的数据存储在名为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)), :]

或者你想把你的数据按平均总收入的顺序每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)
)

假设您的输入如下所示:

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

相关问题 更多 >