Python 建立最大值出现的位置和原因表

Python 建立最大值出现的位置和原因表,python,pandas,Python,Pandas,我有pandas数据,其结构由info() 我可以用这样的东西得到一些零碎的东西 >>> usda.Description[usda[['Protein','TotalFat','Sodium','Carbohydrate']].idxmax()] 4660 SOY PROT ISOLATE,K TYPE,CRUDE PROT BASIS 288 FAT,BEEF TALLOW 264

我有
pandas
数据,其结构由
info()

我可以用这样的东西得到一些零碎的东西

>>> usda.Description[usda[['Protein','TotalFat','Sodium','Carbohydrate']].idxmax()]

4660    SOY PROT ISOLATE,K TYPE,CRUDE PROT BASIS
288                              FAT,BEEF TALLOW
264                                   SALT,TABLE
6959        SWEETENERS,TABLETOP,FRUCTOSE,DRY,PDR
Name: Description, dtype: object

但这是我力所能及的

是否有一种简洁的方法来获取数据集中每个数值列的最大值,并生成一个包含该值、相应的“说明”和找到最大值的列的名称的表?

从以下开始:

  Description  Sodium  TotalFat  Carbohydrate
0         ABC       1        10             4
1         DEF       2         9             5
2         GHI       3         8             0

[3 rows x 4 columns]
您可以融化类别:

>>> mlt = pd.melt(df, id_vars='Description',
...               value_vars=['Sodium', 'TotalFat', 'Carbohydrate'],
...               value_name='value', var_name='category')
>>> mlt  
  Description      category  value
0         ABC        Sodium      1
1         DEF        Sodium      2
2         GHI        Sodium      3
3         ABC      TotalFat     10
4         DEF      TotalFat      9
5         GHI      TotalFat      8
6         ABC  Carbohydrate      4
7         DEF  Carbohydrate      5
8         GHI  Carbohydrate      0

[9 rows x 3 columns]
>>> mdf = mlt.groupby('category').apply(lambda obj: obj.loc[obj.value.idxmax()])
>>> mdf.reset_index(drop=True)
  Description      category  value
0         DEF  Carbohydrate      5
1         GHI        Sodium      3
2         ABC      TotalFat     10

[3 rows x 3 columns]
然后按类别分组:

>>> mlt = pd.melt(df, id_vars='Description',
...               value_vars=['Sodium', 'TotalFat', 'Carbohydrate'],
...               value_name='value', var_name='category')
>>> mlt  
  Description      category  value
0         ABC        Sodium      1
1         DEF        Sodium      2
2         GHI        Sodium      3
3         ABC      TotalFat     10
4         DEF      TotalFat      9
5         GHI      TotalFat      8
6         ABC  Carbohydrate      4
7         DEF  Carbohydrate      5
8         GHI  Carbohydrate      0

[9 rows x 3 columns]
>>> mdf = mlt.groupby('category').apply(lambda obj: obj.loc[obj.value.idxmax()])
>>> mdf.reset_index(drop=True)
  Description      category  value
0         DEF  Carbohydrate      5
1         GHI        Sodium      3
2         ABC      TotalFat     10

[3 rows x 3 columns]
>>> mdf = mlt.groupby('category').apply(lambda obj: obj.loc[obj.value.idxmax()])
>>> mdf.reset_index(drop=True)
  Description      category  value
0         DEF  Carbohydrate      5
1         GHI        Sodium      3
2         ABC      TotalFat     10

[3 rows x 3 columns]