Python 未预定义列时,使用apply方法处理多个列

Python 未预定义列时,使用apply方法处理多个列,python,pandas,Python,Pandas,我想创建一个通用函数来处理所有以某物开头的列。需要注意的是,我不知道有多少列会以该内容开头 例如,我只想处理以“dog”开头的列: 返回 dog1 cat1 dog2 0 1 2 5 1 1 3 4 2 4 6 1 ['dog1', 'dog2'] dog1 cat1 dog2 sum_dogs 0 1 2 5 6 1

我想创建一个通用函数来处理所有以某物开头的列。需要注意的是,我不知道有多少列会以该内容开头

例如,我只想处理以“dog”开头的列:

返回

    dog1    cat1    dog2
0   1          2    5
1   1          3    4
2   4          6    1
['dog1', 'dog2']
    dog1    cat1    dog2    sum_dogs
0      1    2          5    6
1      1    3          4    5
2      4    6          1    5
我可以创建这些列的列表:

col_list = []
for col in df.columns:
    if col.startswith('dog'):
        col_list.append(col)
col_list
返回

    dog1    cat1    dog2
0   1          2    5
1   1          3    4
2   4          6    1
['dog1', 'dog2']
    dog1    cat1    dog2    sum_dogs
0      1    2          5    6
1      1    3          4    5
2      4    6          1    5
在本例中,我使用apply通过单独指定来处理该列表中的内容。我要找的答案是使用列表。这只是为了说明我现在是如何使用apply的

另外,我想应用比求和更复杂的函数,所以我希望能够应用一般函数。用一个函数求这两列的和只是为了示例的目的

def sum_dogs(d1,d2):
    return d1+d2

df['sum_dogs'] = df.apply(lambda x: sum_dogs(x['dog1'],x['dog2']),axis=1)
返回

    dog1    cat1    dog2
0   1          2    5
1   1          3    4
2   4          6    1
['dog1', 'dog2']
    dog1    cat1    dog2    sum_dogs
0      1    2          5    6
1      1    3          4    5
2      4    6          1    5
我想为任何数据帧应用“col_list”的输出可能返回的任何结果


RafaelC的答复如下: 我只是想说明如何使用答案来解决我的(令人困惑的)示例:)


在这里拍摄,您可以使用
.loc[:,cols]
仅对重要的列进行切片,并使用轴1中的
.agg
执行逻辑

df.loc[:, df.columns.str.startswith('dog')].agg(function, 1)
例如,对于简单的求和,这可以是

df.loc[:, df.columns.str.startswith('dog')].agg(sum, 1) # or sum(1)

在这里拍摄,您可以使用
.loc[:,cols]
仅对重要的列进行切片,并使用轴1中的
.agg
执行逻辑

df.loc[:, df.columns.str.startswith('dog')].agg(function, 1)
例如,对于简单的求和,这可以是

df.loc[:, df.columns.str.startswith('dog')].agg(sum, 1) # or sum(1)
你必须使用apply吗? 显示提供多种结果的方法。 也许这正是你想要的

import pandas as pd

df = pd.DataFrame([[1, 2,3], [2, 3,4], [3, 4,5]], columns=['dog1', 'cat1','dog2'])
lookfor = 'dog'
col_list = df.columns[df.columns.str.startswith(lookfor)]

def col_sum(col_list):
    return col_list.sum(axis=1)

def col_collective(col_list):
    return(col_list.values.tolist())

def sum_text(col_list):
    val = col_list.sum(axis=1)
    for i in range(len(val)):
        val[i] = f'{val[i]} {lookfor}s'
    return val

def allthelittleones(col_list):
    val = col_list.sum(axis=1)
    for i in range(len(val)):
        val[i] = str([1,]*val[i])
    return val

df['sum_'+lookfor] = col_sum(df[col_list])
df['collective_'+lookfor] = col_collective(df[col_list])
df['sumtext_'+lookfor] = sum_text(df[col_list])
df['alltheones_'+lookfor] = allthelittleones(df[col_list])

print(df)
你必须使用apply吗? 显示提供多种结果的方法。 也许这正是你想要的

import pandas as pd

df = pd.DataFrame([[1, 2,3], [2, 3,4], [3, 4,5]], columns=['dog1', 'cat1','dog2'])
lookfor = 'dog'
col_list = df.columns[df.columns.str.startswith(lookfor)]

def col_sum(col_list):
    return col_list.sum(axis=1)

def col_collective(col_list):
    return(col_list.values.tolist())

def sum_text(col_list):
    val = col_list.sum(axis=1)
    for i in range(len(val)):
        val[i] = f'{val[i]} {lookfor}s'
    return val

def allthelittleones(col_list):
    val = col_list.sum(axis=1)
    for i in range(len(val)):
        val[i] = str([1,]*val[i])
    return val

df['sum_'+lookfor] = col_sum(df[col_list])
df['collective_'+lookfor] = col_collective(df[col_list])
df['sumtext_'+lookfor] = sum_text(df[col_list])
df['alltheones_'+lookfor] = allthelittleones(df[col_list])

print(df)

您的函数是可矢量化的还是需要使用
pd.DataFrame.apply
apply
+
lambda
如果性能是一个问题,它将不可避免地变慢。
df.assign(sum_dogs=df[col_list].sum(axis=1)
?@PMende,我猜真正的函数可能不是一个简单的和,这就是为什么我认为我们需要更清晰的原因。@roganjosh-Huh?”我想应用“col_list”的任何输出“可以返回任何数据帧。”@sparrow如果你想使用更复杂的函数,你需要更具体一点。你的函数是可向量化的还是需要使用
pd.DataFrame.apply
apply
+
lambda
如果性能有问题,那么速度将不可避免地慢。
df.assign(sum\u dogs=df[col\u list].sum(axis=1)
?@PMende,我猜真正的函数可能不是一个简单的和,这就是为什么我认为我们需要更清楚的原因。@roganjosh-Huh?“我想对任何数据帧应用“col_list”的输出可能返回的任何结果。"@sparrow如果你想使用更复杂的函数,你需要更具体一点。谢谢,在我的示例中,我使用两列求和,但我想对列列表应用更复杂的函数。好的。你能给出一个更复杂的函数的示例吗?我这里的示例非常独立于列。只需更改查找变量。此外,您可以像这样创建列列表,而不是循环。是的,这是一种更优雅的列表构造方法,谢谢!函数的复杂性对于这个问题并不重要,因为我正在寻找一种通用方法来处理列,而不必使用内置函数。谢谢,在我的示例中,我使用summi我想对列列表应用更复杂的函数。好的。你能举一个更复杂的函数的例子吗?我这里的例子是非常独立于列的。只需更改lookfor变量。另外,你可以像这样创建列列表而不是循环。是的,这是一种更优雅的构造方法g列表,谢谢!函数的复杂性对于这个问题并不重要,因为我正在寻找一种处理列而不必使用内置函数的通用方法。