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

2024-04-29 02:59:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据结构:

enter image description here

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

enter image description here

有没有一种使用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

Tags: 对象方法字符串inobj数据结构pandasdf
1条回答
网友
1楼 · 发布于 2024-04-29 02:59:08

示例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并获取sd列表列表,用于x
  • 按顺序合并列表列表
  • 使用itertools.groupby合并列表中删除连续重复项
  • 合并列表的项目与->使其成为单个字符串
  • 最后将序列映射到输入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

相关问题 更多 >