dataFrame自定义排序(里面有map的用法)
https://vimsky.com/examples/usage/python-pandas.Series.map.html
https://blog.csdn.net/weixin_38664232/article/details/89048065
https://www.cnblogs.com/panchuangai/p/13907232.html
方法一:自定义排序新增一列然后用map来匹配
代码:
df = pd.DataFrame({
'cloth_id': [1001, 1002, 1003, 1004, 1005, 1006],
'size': ['S', 'XL', 'M', 'XS', 'L', 'S'],
})
dfrange = pd.DataFrame({'size': ['XS', 'S', 'M', 'L', 'XL']})
dfrange = dfrange.reset_index().set_index('size')
df['sort'] = df['size'].map(dfrange['index'])
df.sort_values(by=['sort'],inplace=True)
方法二:通过pandas.api.type包里的Categorical
from pandas.api.types import CategoricalDtype
df = pd.DataFrame({
'cloth_id': [1001, 1002, 1003, 1004, 1005, 1006],
'size': ['S', 'XL', 'M', 'XS', 'L', 'S'],
})
dtype = CategoricalDtype(['XS', 'S', 'M', 'L', 'XL'], ordered=True)
df['size'] = df['size'].astype(dtype)
df.sort_values(by=['size'], inplace=True)
方法一的用法:
Series.map(self, arg, na_action=None)
根据输入对应关系映射Series的值。
用于将Series中的每个值替换为另一个值,该值可以从函数adict
或一个Series
。
参数:
- arg:function, collections.abc.Mapping subclass 或 Series
-
映射对应关系。
- na_action:{None, ‘ignore’}, 默认为 None
-
如果为‘ignore’,则传播NaN值,而不将其传递给映射对应关系。
返回值:
- Series
-
与调用者相同的索引。
注意:
当arg
是字典,Series中不在字典中的值(作为键)将转换为NaN
。但是,如果字典是dict
定义的子类__missing__
(即提供默认值的方法),则使用此默认值而不是NaN
。
例子:
>>> s = pd.Series(['cat', 'dog', np.nan, 'rabbit'])
>>> s
0 cat
1 dog
2 NaN
3 rabbit
dtype:object
map
接受一个dict
或一个Series
。在中找不到的值dict
转换为NaN
,除非该字典具有默认值(例如defaultdict
):
>>> s.map({'cat': 'kitten', 'dog': 'puppy'})
0 kitten
1 puppy
2 NaN
3 NaN
dtype:object
它还接受一个功能:
>>> s.map('I am a {}'.format)
0 I am a cat
1 I am a dog
2 I am a nan
3 I am a rabbit
dtype:object
为了避免将函数应用于缺失值(并将其保留为NaN
)na_action='ignore'
可以使用:
>>> s.map('I am a {}'.format, na_action='ignore')
0 I am a cat
1 I am a dog
2 NaN
3 I am a rabbit
dtype:object