我想创建一个通用函数来处理所有以某物开头的列。需要说明的是,我不知道事先会从那件事开始多少列。
例如,我只想处理以“ 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”的输出可能返回的任何内容。
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)
答案 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)