如何根据 python 中的两个不同列(不使用循环)获取每行对象的转换字符串?

How to get a transition string per row object based on two different columns in python (without using loops)?

我有以下数据结构:

s列和d列表示x列对象的转换。我想要做的是为 x 列中存在的每个对象获取一个转换字符串。例如新列如下:

是否有使用 pandas 而不使用太多循环的精简方法?

这是我试过的代码:

obj = df['x'].tolist()
rows = []

for o in obj:
    locs = df[df['x'] == o]['s'].tolist()
    str_locs = '->'.join(str(l) for l in locs)
    print(str_locs)
    d = dict()
    d['x'] = o
    d['new'] = str_locs
    rows.append(d)

tmp = pd.DataFrame(rows)

输出温度为:

    x   new
    a   1->2->4->8
    a   1->2->4->8
    a   1->2->4->8
    a   1->2->4->8
    b   1->2
    b   1->2

示例 df:

df = pd.DataFrame({"x":["a","a","a","a","b","b"], "s":[1,2,4,8,5,11],"d":[2,4,8,9,11,12]})

print(df)

       x    s   d
    0   a   1   2
    1   a   2   4
    2   a   4   8
    3   a   8   9
    4   b   5   11
    5   b   11  12

以下代码将生成列 x 中存在的所有对象的转换字符串。

  • groupby 相对于列 x 并得到 list of lists of sd 对于 x
  • 中可用的每个对象
  • 合并列表列表顺序
  • 使用itertools.groupby
  • 合并列表中删除连续重复项
  • 加入合并列表的项目->使其成为一个字符串。
  • 最后将系列映射到 input df
  • x
from itertools import groupby 

grp = df.groupby('x')[['s', 'd']].apply(lambda x: x.values.tolist())
grp = grp.apply(lambda x: [str(item) for tup in x for item in tup])
sr = grp.apply(lambda x: "->".join([i[0] for i in groupby(x)]))
df["new"] = df["x"].map(sr)
print(df)

       x    s   d   new
    0   a   1   2   1->2->4->8->9
    1   a   2   4   1->2->4->8->9
    2   a   4   8   1->2->4->8->9
    3   a   8   9   1->2->4->8->9
    4   b   5   11  5->11->12
    5   b   11  12  5->11->12