python - 如何使用 pandas 标准提取组列表元素

标签 python pandas dataframe pandas-groupby series

我有一个 pandas 数据框,如下所示

ID,color
1, Yellow
1, Red
1, Green
2, Red
2, np.nan
3, Green
3, Red
3, Green
4, Yellow
4, Red
5, Green
5, np.nan
6, Red
7, Red

fd = pd.read_clipboard(sep=',')

正如您在输入数据框中看到的,某些 ID 具有与其关联的多种颜色。

因此,每当有多种颜色与之关联时,我想根据以下标准仅选择一种颜色

['Green','Red','Yellow'] = Choose 'Green'
['Red', 'Yellow'] = Choose 'Yellow'
['Green', 'Yellow'] = Choose 'Green'

基本上,绿色是第一优先。第二优先选择黄色,最后优先选择红色。

因此,如果 ID 每当有绿色,请选择绿色(不关心其他颜色)。

如果ID有黄色和红色,则选择黄色

如果其所有行的 ID 仅具有 NA,请将其保留为 NA

我尝试了以下方法,但这只能让我获得颜色列表

fd.groupby('ID',as_index=False)['color'].aggregate(lambda x: list(x))
fd[final_color] = [if i[0] =='Green' for i in fd[col]]

我希望我的输出如下所示

enter image description here

更新

enter image description here

最佳答案

借助首选项字典对数据帧的颜色值进行排序,然后删除 ID 上的重复项

d = {'Green': 1, 'Yellow': 2, 'Red': 3}
df.sort_values('color', key=lambda c: c.map(d)).drop_duplicates('ID')

另一种方法是首先将 color 列转换为有序分类类型,然后进行分组和聚合以选择最小值

df['color'] = pd.Categorical(df['color'], ['Green', 'Yellow', 'Red'], True)
df.groupby('ID', as_index=False)['color'].agg('min')

   ID   color
0   1   Green
1   2     Red
2   3   Green
3   4  Yellow
4   5   Green
5   6     Red
6   7     Red

关于python - 如何使用 pandas 标准提取组列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71544600/

相关文章:

python - 对文件使用 asyncio 真的是个好主意吗

python - 根据附加列优先过滤 Pandas 数据框中的重复项

python - Python 数据框中的插值

python - 如何分组和计数

python - 对当前函数使用 python getattr/setattr

python - Pandas 数据框与自身的笛卡尔积

python - 如何对具有相同键的行求和?

python - MultiIndex 的 Pandas 元组列表

python - 配置独立的小部件(Tkinter ttk、Python)

python - 将 pandas 数据框中的一些行添加到下一个,然后删除它们