我是熊猫新手,请耐心等待。我想在数据帧上应用模式,但要进行一些调整。列Item_1,Item_2和Item_3可以有四个值[High,Medium,Low,NA]。高优先级最高,低优先级最低。不适用。
数据如下图所示。
date Type Item_1 Item_2 Item_3 Price
0 2021-01-01 A High Low Low 20
1 2021-01-01 A High Low Low 20
2 2021-01-01 A Low High Low 20
3 2021-01-01 A Medium High High 20
4 2021-01-01 B Low High Low 15
5 2021-01-01 B Medium High High 15
6 2021-01-01 B Low Low Medium 15
6 2021-01-02 A NA High NA 30
7 2021-01-02 A NA High NA 30
8 2021-01-02 A NA NA NA 30
9 2021-01-02 A NA NA Low 30
10 2021-01-02 A NA NA Low 30
11 2021-01-02 A NA Low High 30
预期产量:
date Type Item_1 Item_2 Item_3 Price
0 2021-01-01 A High High Low 20
1 2021-01-01 B Low High High 15
2 2021-01-02 A NA High Low 30
我的用例是,正如您所看到的,Item_1中的第一行现在具有值High(最频繁)。
但在ITEM_2两个低和高有相同的频率,但高有更多的优先事项获得价值高的输出。
在Item_3中,Low最常见,因此值为Low。
编辑:不
适用不适用。第二个最有效的值应作为输出,如日期2021-01-02 NA的频率最高,但第二个最频繁的值为High。
值NA不对应于NaN而是一个字符串对象。与其他分类值相似。只是无论什么时候,无论日期出现的频率是多少,无论是高/低/中,我都想选择发生次数/频率第二高的分类值
我认为有多个具有不同日期的行,因此首先通过进行重塑DataFrame.melt
,然后将值转换为ordered categorical
s,最后GroupBy.agg
在lambda函数中按组获取第一个模式,最后通过Series.unstack
以下方式进行塑形:
cols = df.columns
df = df.melt(['date','Type','Price'])
df["value"] = pd.Categorical(df["value"],
categories=["High", "Medium", "Low"],
ordered=True)
df = (df.groupby(['date','Type','Price','variable'])['value']
.agg(lambda x: x.mode().iat[0])
.unstack()
.rename_axis(None, axis=1)
.reset_index()
.reindex(cols, axis=1))
print (df)
date Type Item_1 Item_2 Item_3 Price
0 2021-01-01 A High High Low 20
1 2021-01-01 B Low High High 15
2 2021-01-02 A Medium Low High 30
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句