![](/img/trans.png)
[英]Pandas Dataframe: groupby id to find max column value and return corresponding value of another column
[英]Find max and min value for several numeric column and return dataframe with the corresponding row value
我有以下數據集
對於每一年的列,我想找到最大值和最小值,並返回“最大值”和“最小值”以及每個值對應的“地理”值。
例如,對於“1950”、“1951”等,我想生成如下所示的 dataframe:
這是一個類似的線程,但那里建議的方法似乎不起作用,因為我的列有數字標題,而且我想要的結果略有不同。
任何意見將是有益的。 謝謝。
這應該可行,但肯定存在更好的解決方案。 我假設你最初的 dataframe 是一個名為 df 的 pandas dataframe。
dff = pd.DataFrame({'row_labels':['Max_value','Max_geo','Min_value','Min_geo']})
for col in df.columns[2:]: #start at column 1950
col_list = []
col_list.append(df[col].min())
col_list.append(df.loc[df[col] == df[col].min(),'Geo'].values[0])
col_list.append(df[col].max())
col_list.append(df.loc[df[col] == df[col].max(),'Geo'].values[0])
dff[col] = col_list
dff.set_index('row_labels', inplace = True, drop = True)
您可以使用max
、 min
、 idxmax
和idxmin
執行此操作,而無需循環或進行任何值比較來查找最大值,如下所示(假設您的 dataframe 是df
):
(df.melt(id_vars='Geo', var_name='year')
.set_index('geo')
.groupby('year')
.agg({'value': ('max', 'idxmax', 'min', 'idxmin')})
.T)
您可以將df.set_index
與stack
和Groupby.agg
一起使用:
In [1915]: df = pd.DataFrame({'Geo':['Afghanistan', 'Albania', 'Algeria', 'Angola'], 'Geo code':[4,8,12,24], '1950':[27.638, 54.191, 42.087, 35.524], '1951':[27.878, 54.399, 42.282, 35.599]})
In [1914]: df
Out[1914]:
Geo Geo code 1950 1951
0 Afghanistan 4 27.638 27.878
1 Albania 8 54.191 54.399
2 Algeria 12 42.087 42.282
3 Angola 24 35.524 35.599
In [1916]: x = df.set_index('Geo').stack().reset_index(level=1, name='value').query('level_1 != "Geo code"')
In [1917]: res = x.groupby('level_1').agg({'value': ('max', 'idxmax', 'min', 'idxmin')}).T
In [1918]: res
Out[1918]:
level_1 1950 1951
value max 54.191 54.399
idxmax Albania Albania
min 27.638 27.878
idxmin Afghanistan Afghanistan
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.