Python 未预定义列时,使用apply方法处理多个列
我想创建一个通用函数来处理所有以某物开头的列。需要注意的是,我不知道有多少列会以该内容开头 例如,我只想处理以“dog”开头的列: 返回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
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列表,谢谢!函数的复杂性对于这个问题并不重要,因为我正在寻找一种处理列而不必使用内置函数的通用方法。