构建发现最大值的熊猫桌



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

报告
<class 'pandas.core.frame.DataFrame'>
Int64Index: 7058 entries, 0 to 7057
Data columns (total 16 columns):
ID              7058 non-null int64
Description     7058 non-null object
Calories        7057 non-null float64
Protein         7057 non-null float64
TotalFat        7057 non-null float64
Carbohydrate    7057 non-null float64
Sodium          6974 non-null float64
SaturatedFat    6757 non-null float64
Cholesterol     6770 non-null float64
Sugar           5148 non-null float64
Calcium         6922 non-null float64
Iron            6935 non-null float64
Potassium       6649 non-null float64
VitaminC        6726 non-null float64
VitaminE        4338 non-null float64
VitaminD        4224 non-null float64
dtypes: float64(14), int64(1), object(1)

我想产生与沿

线的数字列的每个最大值相对应的描述和值的表
Description       Value     Category
SALT, TABLE       38758.00  Sodium
FAT,BEEF TALLOW   100.00    TotalFat
FRUCTOSE,DRY,PDR  100.00    Carbohydrate
...

我可以用

之类的东西得到一些零碎的东西
>>> 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

>>> usda[['Protein','TotalFat','Sodium','Carbohydrate']].max()
Protein            88.32
TotalFat          100.00
Sodium          38758.00
Carbohydrate      100.00
dtype: float64

,但据我所知。

是否有一种紧凑的方法可以找到我数据集中每个数字列的最大值,并产生一个具有该值的表,相应的"描述"和找到最大值的列的名称?

从:

开始
  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]

最新更新