首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据python中的两个不同列(不使用循环)获取每个行对象的转换字符串?

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

Stack Overflow用户
提问于 2021-04-29 11:45:48
回答 1查看 102关注 0票数 1

我有以下数据结构:

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

有没有一种不需要太多循环就可以利用熊猫的精益方法呢?

这是我试过的代码:

代码语言:javascript
运行
复制
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)

这给出了输出温度如下:

代码语言:javascript
运行
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-29 13:21:12

示例df:

代码语言:javascript
运行
复制
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
  • Merge中每个可用对象的x列表列表( of ‘sd )列表sequentially
  • Remove 连续重复的E 223E 124合并列表e 225/code>使用itertools.groupby
  • Join将合并列表中的项与E 131->E 232合并成一个string.
  • Finally映射。df

输入的列x系列

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67316741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档