首页 > 解决方案 > Pandas - 创建最大键值对的 DataFrame

问题描述

我有一个用于 ID 集合的键值对的 Pandas DataFrame。DataFrame 中的列是(ID、Key、Value)。

data = {
    "ID":{0:1,1:1,2:1,3:2,4:2,5:2,6:3,7:3,8:3,9:4,10:4,11:4},
    "Key":{0:"A",1:"B",2:"B",3:"A",4:"B",5:"B",6:"A",7:"B",8:"B",9:"A",10:"B",11:"C"},
    "Value":{0:28,1:94,2:107,3:67,4:70,5:70,6:24,7:77,8:87,9:24,10:83,11:83}
} 
data = pd.DataFrame(data)

数据框

我正在尝试创建一个新表,其中列是唯一键,它们的关联值是每个 ID 的最大值:

在此处输入图像描述

到目前为止,我能够创建一个包含所需最大值的 DataFrame:

max_data = data.loc[ data.groupby(["ID", "Key"])["Value"].idxmax() ]

在此处输入图像描述

但是,我不确定获取 DataFrame 的最佳方法,其中列是具有相关值的唯一键。这是我到目前为止所拥有的,但我试图避免循环:

result = pd.DataFrame(max_data["ID"].unique(), columns=["ID"])
for key in max_data["Key"].unique():
    result = result.merge(
        max_data.loc[max_data["Key"] == key][["ID", "Value"]],
        how="left",
        on="ID"
    )

标签: pandas

解决方案


就像是pivot_table

data.pivot_table(index='ID',columns='Key',values='Value',aggfunc='max')
Out[22]: 
Key     A      B     C
ID                    
1    28.0  107.0   NaN
2    67.0   70.0   NaN
3    24.0   87.0   NaN
4    24.0   83.0  83.0

推荐阅读