Похожие вопросы как: pandas: Как разделить текст в столбце на несколько строк?
Вы могли бы сделать:
>> a=pd.DataFrame({"var1":"a,b,c d,e,f".split(),"var2":[1,2]})
>> s = a.var1.str.split(",").apply(pd.Series, 1).stack()
>> s.index = s.index.droplevel(-1)
>> del a['var1']
>> a.join(s)
var2 var1
0 1 a
0 1 b
0 1 c
1 2 d
1 2 e
1 2 f
Вы можете передать функцию re.sub()
, которая позволит вам это сделать, вот пример:
def upper_repl(match):
return 'GOO' + match.group(1).upper() + 'GAR'
И пример ее использования:
>>> re.sub(r'foo([a-z]+)bar', upper_repl, 'foobazbar')
'GOOBAZGAR'
Для тех, кто сталкивается с этим в google ...
Вы также можете использовать re.sub для соответствия повторяющимся шаблонам. Например, вы можете преобразовать строку с пробелами в camelCase:
def to_camelcase(string):
string = string[0].lower() + string[1:] # lowercase first
return re.sub(
r'[\s]+(?P<first>[a-z])', # match spaces followed by \w
lambda m: m.group('first').upper(), # get following \w and upper()
string)
to_camelcase('String to convert') # --> stringToConvert
Вы можете использовать некоторые вариации этого:
s = 'foohellobar'
def replfunc(m):
return m.groups()[0]+m.groups()[1].upper()+m.groups()[2]
re.sub('(foo)([a-z]+)(bar)',replfunc,s)
дает выход:
'fooHELLObar'
Если у вас уже есть заменяющая строка (шаблон), вы не можете быть заинтересованы в ее замене с многословием m.group(1)+...+m.group(2)+...+m.group(3)
... Иногда приятно иметь аккуратную небольшую строку.
Вы можете использовать функцию MatchObject
expand () для оценки шаблона для совпадения таким же образом, как sub () , что позволяет сохранить как можно больше ваш оригинальный шаблон, насколько это возможно. Вы можете использовать upper
в соответствующих фрагментах.
re.sub(r'foo([a-z]+)bar', lambda m: 'GOO' + m.expand('\1GAR').upper())
Хотя это не было бы особенно полезно в приведенном выше примере, и, хотя оно не помогает при сложных обстоятельствах, оно может быть более удобным для более длинных выражения с большим количеством захваченных групп, такие как регулярное выражение для цензурирования MAC-адресов, где вы просто хотите, чтобы полная замена была заглавной или нет.
Вы имеете в виду что-то вроде этого?
>>>x = "foo spam bar"
>>>re.sub(r'foo ([a-z]+) bar', lambda match: r'foo {} bar'.format(match.group(1).upper()), x)
'foo SPAM bar'
Для справки, вот ссылка docstring re.sub
(выделение мое).
Вернуть строку, полученную путем замены крайних левых неперекрывающихся вхождений шаблона в строке заменяющим repl. repl может быть либо строкой, либо вызываемой; если строка, обратная косая черта в ней обрабатывается. Если он является вызываемым, он передает объект соответствия и должен возвращать заменяющую строку, которая будет использоваться.
blockquote>