如何根据 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 s 和 d 对于 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
我有以下数据结构:
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 s 和 d 对于 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