Python pandas 数据框使用 apply 来调用具有列表输出的函数

问题描述 投票:0回答:1

我正在尝试将函数应用于 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

有人可以帮助我了解问题所在吗?我使用输出一个标量(将输出定向到新列)的函数做了基本上相同的事情,并且效果很好。

python pandas lambda apply
1个回答
0
投票

您使用

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
© www.soinside.com 2019 - 2024. All rights reserved.