我有这个数据框:

df = pd.DataFrame({'CLASS': ['A', 'B', 'A'],
 'MEMBERS': ['foo & bar', 'bar & luz', 'baz']})

print(df)
#   CLASS    MEMBERS
# 0     A  foo & bar
# 1     B  bar & luz
# 2     A        baz

首先,我想对列CLASS进行分组,并组合列MEMBERS的唯一值.其次,我需要唯一的组合以特定的顺序:['foo', 'bar', 'baz', 'luz'].

我做到了第一个:

df.groupby('CLASS')['MEMBERS'].agg(lambda s: " & ".join(set(' & '.join(s).split(' & '))))

# CLASS
# A    foo & baz & bar
# B          luz & bar
# Name: MEMBERS, dtype: object

你们能教我怎么订货吗?

我的预期输出是:

# CLASS
# A    foo & bar & baz
# B          bar & luz
# Name: MEMBERS, dtype: object

推荐答案

您可以将sorted与自定义词典一起使用:

order = ['foo', 'bar', 'baz', 'luz']

mapper = {k: i for i,k in enumerate(order)}
# {'foo': 0, 'bar': 1, 'baz': 2, 'luz': 3}

out = (df.groupby('CLASS')['MEMBERS']
         .agg(lambda s: " & ".join(sorted(set(' & '.join(s).split(' & ')),
                                          key=mapper.get)))
      )

输出:

CLASS
A    foo & bar & baz
B          bar & luz
Name: MEMBERS, dtype: object

带有函数和itertools.chain的备选方案:

from itertools import chain

def cust_join(s, order):
    mapper = {k: i for i,k in enumerate(order)}
    return ' & '.join(sorted(set(chain.from_iterable(x.split(' & ') for x in s)),
                             key=mapper.get
                            ))

out = (df.groupby('CLASS')['MEMBERS']
         .agg(cust_join, order=['foo', 'bar', 'baz', 'luz'])
      )

Python相关问答推荐

查找3D数组中沿一个轴的相同值序列的长度(与行程长度编码相关)

在Python中,什么表达相当于0x1.0p-53?

Ibis中是否有一个ANY或ANY_UTE表达,可以让我比较子查询返回的一组值中的值?

如何处理必须存在于环境中但无法安装的Python项目依赖项?

"如果发生特定错误,返回值

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

如何用symy更新分段函数

将HLS纳入媒体包

如何让 turtle 通过点击和拖动来绘制?

理解Python的二分库:澄清bisect_left的使用

对Numpy函数进行载体化

将jit与numpy linSpace函数一起使用时出错

标题:如何在Python中使用嵌套饼图可视化分层数据?

海运图:调整行和列标签

如何访问所有文件,例如环境变量

将图像拖到另一个图像

发生异常:TclMessage命令名称无效.!listbox"

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

在Mac上安装ipython

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)