未预定义列时使用Pandas Apply方法处理多个列

时间:2018-08-09 17:37:12

标签: python pandas

我想创建一个通用函数来处理所有以某物开头的列。需要说明的是,我不知道事先会从那件事开始多少列。

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

df = pd.DataFrame([[1, 2,5], [1, 3,4], [4, 6,1]], columns=['dog1', 'cat1','dog2'])

返回

    dog1    cat1    dog2
0   1          2    5
1   1          3    4
2   4          6    1

我可以创建这些列的列表:

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

返回

['dog1', 'dog2']

在此示例中,我使用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    sum_dogs
0      1    2          5    6
1      1    3          4    5
2      4    6          1    5

我想对任何DataFrame应用“ col_list”的输出可能返回的任何内容。


来自RafaelC的

ANSWER: 我只是想展示答案如何用于解决我(令人困惑的)示例:)。

def sum_dogs(col_list):
    sum = 0
    for col in col_list:        
        sum = sum+col
    return sum

df['sum_dogs'] = df.loc[:, df.columns.str.startswith('dog')].agg(sum_dogs, 1)

2 个答案:

答案 0 :(得分:2)

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

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

例如,对于一个简单的总和,可以是

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

答案 1 :(得分: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)