经过一番谷歌搜索并且没有很好的匹配之后,我希望您能帮助我进行以下转换。我在以{FROM-TO}
样式编写的值中有一些范围:
df_current = pd.DataFrame.from_dict({'A': ['test{1-2}this{1-3}', 'or{2-3}'], 'B': ['yes', 'no']})
A B
0 test{1-2}this{1-3} yes
1 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 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
请注意,对于新行,B只是重复了。
谢谢, 雷内(René)
答案 0 :(得分:3)
使用:
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
函数,该函数将输入作为字符串参数,例如'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:使用A
列上的Series.map
将函数mapper
映射到列A
的每个值上。
# print(df)
A B
0 [test1this1, test1this2, test1this3, test2this1, test2this2, test2this3] yes
1 [or2, or3] no
步骤C:使用A
列上的DataFrame.explode
将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