首页 > 解决方案 > 检查 Pandas 系列中的最大值,其中该系列包含具有数值的字母

问题描述

我有一个包含 6 列的 pandas 数据框,每列都有一个“状态”。这些状态可以是以下任何一种:T, N, 0, U, D, 1, 2, 3, 4, 5, 6, 8。出于比较的目的,T > N > 0 > U > D > 1 > 2...

我想要实现的是创建一个新列,WORST STATUS它可以从该列表中挑选出最大值(类似于df.max()max 方法可以识别“U”大于 0。

我知道我可能可以将这一切包含在 if-else 中并进行元素比较,但我想知道是否还有更“干净”的东西?

标签: pythonpandasdataframemax

解决方案


您可以使用ordered Categorical,因此可能使用max功能:

df = pd.DataFrame(data={'col':[1, 2, 3, 4, 'N', 'N', 0, 'U', 'D', 5, 6, 8]})

cats = ['T', 'N', 0, 'U', 'D', 1, 2, 3, 4, 5, 6, 8]
df['col'] = pd.Categorical(df['col'], ordered=True, categories=cats[::-1])

print (df['col'])
Categories (12, object): [8 < 6 < 5 < 4 ... 'U' < 0 < 'N' < 'T']

#in data is no T, so N is maximal
print (df['col'].max())
N

如果需要处理多个列:

cols = ['col1','col2','col3']
df[cols] = df[cols].apply(lambda x: pd.Categorical(x, ordered=True, categories=cats[::-1]))

进而:

print (df[cols].max(axis=1))

推荐阅读