python 按列分组并按层次结构选择

标签 python pandas pandas-groupby

我有一个数据框,例如:

col-a   col-b
1       None
1       Failed
1       Passed
2       None
2       Passed
3       Inconclusive
3       Passed

以及术语的层次结构:

Failed > Inconclusive > Passed > None

我怎样才能得到类似的东西:

1       Failed
2       Passed
3       Inconclusive

谢谢!

最佳答案

您可以为 Series.map 创建的列创建字典,然后使用 DataFrame.sort_values 按两列排序并通过 DataFrame.drop_duplicates 获取每组的第一个唯一行:

d = {'Failed':0,'Inconclusive':1, 'Passed':2, None: 3}
df['new'] = df['col-b'].map(d)
df = df.sort_values(['col-a', 'new']).drop_duplicates('col-a').drop('new', 1)
print (df)
   col-a         col-b
1      1        Failed
4      2        Passed
5      3  Inconclusive

另一个想法 DataFrameGroupBy.idxmin :

d = {'Failed':0,'Inconclusive':1, 'Passed':2, None: 3}
df =  df.loc[df['col-b'].map(d).groupby(df['col-a']).idxmin()]
print (df)
   col-a         col-b
1      1        Failed
4      2        Passed
5      3  Inconclusive

关于python 按列分组并按层次结构选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57802242/

相关文章:

python - (Numpy C API)迭代单个数组 : NpyIter vs for loop (with PyArray_DATA)

python - 如何使用 Django Serializer Validation 显示错误?

python - 如何使用Python Pandas使用动态字符串来过滤数据帧

python - 如何通过复制上一行来动态创建新行

python - 使用 Tkinter 添加标准对象作为 Frame 类属性

python - 切片具有不同长度的子列表

python - 将大型 CSV 数据集分成更短的 block

python - 如何循环 Pandas 数据帧行中的 NaN?

python - 将值应用于列并按这些值对所有列进行分组

python - Pandas:groupby value_count 按频率和子类别过滤