为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫:将具有多个范围的值转换为行

熊猫:将具有多个范围的值转换为行

尚方宝剑之说 2023-03-08 15:25:24
经过一些谷歌搜索但没有任何好的匹配,我希望你能帮助我完成以下转换。我有一些以{FROM-TO}样式编写的值的范围:df_current = pd.DataFrame.from_dict({'A': ['test{1-2}this{1-3}', 'or{2-3}'], 'B': ['yes', 'no']})    A                   B0   test{1-2}this{1-3}  yes1   or{2-3}             no为了进一步处理,我想创建这个:df_wish  = pd.DataFrame.from_dict({ \    'A': [\        'test1this1', 'test1this2', 'test1this3',\        'test2this1', 'test2this2', 'test2this3', \        'or2', 'or3'],    'B': [ \        'yes', 'yes', 'yes', 'yes', 'yes', 'yes', \        'no', 'no']})    A           B0   test1this1  yes1   test1this2  yes2   test1this3  yes3   test2this1  yes4   test2this2  yes5   test2this3  yes6   or2         no7   or3         no请注意,B 只是为新行复制。
查看完整描述

1 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

使用:


import re

from itertools import product


def mapper(s):

    lst = re.findall(r'(\w+)\{(\d+)-(\d+)\}', s)

    prd = [['{}{}'.format(*p) for p in product([w], range(int(m), int(n) + 1))] for w, m, n in lst]

    return list(map(''.join, product(*prd)))


df['A'] = df['A'].map(mapper)

df = df.explode('A').reset_index(drop=True)

细节:


步骤 A:定义一个mapper函数,它将输入作为字符串参数 eg'test{1-2}this{1-3}'并映射此字符串以生成所有可能的字符串,这些字符串可以通过将范围与相应的单词相乘获得。mapper输入字符串的函数工作'test{1-2}this{1-3}'可以进一步解释为:


print(lst) # Use 're.findall' to parse all the words and their corresponding ranges

[('test', '1', '2'), ('this', '1', '3')]


print(prd) # Use 'itertools.product' to get all inner level products

[['test1', 'test2'], ['this1', 'this2', 'this3']]


# Again use 'itertools.product' to get all outer level products

['test1this1', 'test1this2', 'test1this3', 'test2this1', 'test2this2', 'test2this3']

步骤 B:使用Series.mapon columnA将函数映射mapper到 column 的每个值A


# print(df)


                                                                          A    B

0  [test1this1, test1this2, test1this3, test2this1, test2this2, test2this3]  yes

1                                                                [or2, or3]   no

步骤 C:使用DataFrame.explodeA将每个列表(如列中的值)转换A为复制索引值的行。


# print(df)

            A    B

0  test1this1  yes

1  test1this2  yes

2  test1this3  yes

3  test2this1  yes

4  test2this2  yes

5  test2this3  yes

6         or2   no

7         or3   no


查看完整回答
反对 回复 2023-03-08
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信