gpt4 book ai didi

python - 在列组合上扩展数据框

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:14 26 4
gpt4 key购买 nike

似乎找不到合适的词输入 Stack Overflow,而且我在以前写的代码中找不到答案,所以我别无选择,只能再次询问。

我正在尝试在特定列的所有组合上扩展我的数据框:

注意:Pandas 版本 23.4

给定以下数据框

name      num
A 1X,2Y,3Z
B 1X,2Y,3Z
C 9Z

我正在努力做到:

name     num
A 1X,2Y
A 1X,3Z
A 2Y,3Z
B 1X,2Y
B 1X,3Z
B 2Y,3Z
C 9Z

我(认为)是正确的:

s = (pd.DataFrame(df.pop('num').values.tolist(), index = df.index)
.stack()
.reset_index(level=1, drop=True)
.rename('num')
.astype(str)
)

df = df.join(s)

最佳答案

这是一个 itertools基于方法:

from itertools import chain, combinations

# split the strings by "," and
# extract all length 2 combinations from the strings
l = df.num.str.split(',').apply(combinations, r=2).map(list)
# construct a dataframe from the result
out = pd.DataFrame({'name':df.name.repeat(l.str.len()),
'num':list(chain.from_iterable(l.values))})
# join the tuples containing each combination
out['num'] = out.num.str.join(', ')

name num
0 A 1X, 2Y
0 A 1X, 3Z
0 A 2Y, 3Z
1 B 1X, 2Y
1 B 1X, 3Z
1 B 2Y, 3Z

更新

如果条目只有一项:

l = df.num.str.split(',').apply(lambda x: list(combinations(x, r=2)) or x)
nums = chain.from_iterable([map(', '.join, i) if len(i) > 1 else i for i in l])
out = pd.DataFrame({'name':df.name.repeat(l.str.len()),
'num':list(nums)})

name num
0 A 1X, 2Y
0 A 1X, 3Z
0 A 2Y, 3Z
1 B 1X, 2Y
1 B 1X, 3Z
1 B 2Y, 3Z
2 C 9Z

关于python - 在列组合上扩展数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56754674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com