我正在尝试将函数应用于 pandas 数据框列的每个元素。该函数应该返回一个字符串列表。我想让列表中的每个字符串成为它自己的列。这是我一直在做的事情:
def parse_config(string):
out = []
pos = list()
for x in re.finditer(pattern='\.',string=str(string)):
pos.append(x.start())
out.append(str(string)[0:pos[-2]])
out.append(str(string)[pos[-2]+2:pos[-1]-1])
out.append(str(string)[pos[-1]+1:][0:-1])
out.append(str(string)[pos[-1]+1:][-1])
return out
这个函数,给定像 'abc.(e).ghi' 这样的字符串,将返回 ['abc','e','gh','i']。
我希望将每个列表成员放置在数据框的一列中。
我已经尝试过了
df[['a','b','c','d']]=df.apply(lambda x: parse_config(x['configuration']),axis=1)
希望新列
'a','b','c','d'
将填充函数的输出。我得到的错误是:
IndexError: list index out of range
有人可以帮助我了解问题所在吗?我使用输出一个标量(将输出定向到新列)的函数做了基本上相同的事情,并且效果很好。
您使用
df.apply()
所做的尝试大部分是正确的,但是您需要在 result_type='expand'
方法中使用 apply()
来直接将列表扩展到列:
import pandas as pd
import re
data = {'configuration': ['abc.(e).ghi', 'test.(m).example', 'sample.(d).demo', 'failtest']}
df = pd.DataFrame(data)
def parse_config(string):
try:
pos = [x.start() for x in re.finditer(pattern='\.', string=str(string))]
if len(pos) < 2:
return [None, None, None, None]
out = []
out.append(str(string)[0:pos[-2]])
out.append(str(string)[pos[-2]+2:pos[-1]-1])
out.append(str(string)[pos[-1]+1:][0:-1])
out.append(str(string)[pos[-1]+1:][-1])
return out
except IndexError:
return [None, None, None, None]
df[['a', 'b', 'c', 'd']] = df.apply(lambda x: parse_config(x['configuration']), axis=1, result_type='expand')
print(df)
这给出了
configuration a b c d
0 abc.(e).ghi abc e gh i
1 test.(m).example test m exampl e
2 sample.(d).demo sample d dem o
3 failtest None None None None