Python 如何在单个数据帧列上应用多个函数?

Python 如何在单个数据帧列上应用多个函数?,python,pandas,dataframe,apply,Python,Pandas,Dataframe,Apply,假设我有df: Name Sequence Bob IN,IN Marley OUT,IN Jack IN,IN,OUT,IN Harlow df有名称和“输入/输出”序列。序列列中可以有空白值。如何有效地将这两个函数应用于序列列?类似这样的伪代码: df['Sequence']=转换器(定序器(df['Sequence'])) 要生成此数据帧 Name Sequence Bob

假设我有df:

Name         Sequence
Bob             IN,IN
Marley         OUT,IN
Jack     IN,IN,OUT,IN
Harlow               
df有名称和“输入/输出”序列。序列列中可以有空白值。如何有效地将这两个函数应用于序列列?类似这样的伪代码:

df['Sequence']=转换器(定序器(df['Sequence']))

要生成此数据帧

Name         Sequence
Bob                IN
Marley         OUT-IN
Jack        IN-OUT-IN
Harlow  
我浏览了一下这里,评论说不要使用apply,因为它效率低下,而且我需要效率,因为我正在处理一个大型数据集。

itertools
  • 使用
    groupby
    获取唯一(非重复)的内容
  • 使用
    islicde
    获取前3个

变化与更好的关闭,最大限度地提高未来的灵活性

from itertools import islice, groupby

def get_f(n, splitter=',', joiner='-'):
    def f(s):
        return joiner.join([k for k, _ in islice(groupby(s.split(splitter)), n)])
    return f

df.assign(Sequence=[*map(get_f(3), df.Sequence.fillna(''))])
另一个变化使我的行为更加明显(不那么令人讨厌的Python语言)


我认为使用
apply()。这就是它的设计目的-将一个函数应用于数据帧的一列。您的数据集有多大?如果它们是几百万行,则不会太长。请尝试加快您的函数,因为将您要进行的更改矢量化似乎不是一件小事。@pavel好的,我将使用apply。我该怎么做?你为什么要做这些恶作剧,只是为了用破折号替换逗号
df.Sequence.fillna(“”).str.replace(‘,’,‘-’)
@piRSquared这是我的想法,但是以“Jack”作为名称的行,输入从“IN,IN,OUT,IN”变为“IN-OUT-IN”(去掉第一个或第二个“IN”),谢谢!因此,通过使用第一个示例,我可以发现'Sequence='设置了列的名称,如果我将其更改为Sequence123,它将创建一个新列。有没有办法将列名设置为类似“Sequence InOut”的字符串?我试着传入一个str-var,但这只是写出了var的实际名称。另外,你能解释一下括号中的参数吗?看起来它把f映射到df.Sequence下的所有东西,但是“*”是什么意思呢?
from itertools import islice, groupby

def f(s):
    return '-'.join([k for k, _ in islice(groupby(s.split(',')), 3)])

df.assign(Sequence=[*map(f, df.Sequence.fillna(''))])

     Name   Sequence
0     Bob         IN
1  Marley     OUT-IN
2    Jack  IN-OUT-IN
3  Harlow           
from itertools import islice, groupby

def get_f(n, splitter=',', joiner='-'):
    def f(s):
        return joiner.join([k for k, _ in islice(groupby(s.split(splitter)), n)])
    return f

df.assign(Sequence=[*map(get_f(3), df.Sequence.fillna(''))])
from itertools import islice, groupby

def get_f(n, splitter=',', joiner='-'):
    def f(s):
        return joiner.join([k for k, _ in islice(groupby(s.split(splitter)), n)])
    return f

f = get_f(3)
df['Sequence-InOut'] = [f(s) for s in df.Sequence.fillna('')]
df

     Name      Sequence Sequence-InOut
0     Bob         IN,IN             IN
1  Marley        OUT,IN         OUT-IN
2    Jack  IN,IN,OUT,IN      IN-OUT-IN
3  Harlow          None