gpt4 book ai didi

python - pandas 根据条件执行操作 - 不同的方式和最佳实践?

转载 作者:太空宇宙 更新时间:2023-11-03 20:38:28 24 4
gpt4 key购买 nike

我想根据值的条件在数据帧上运行多个不同的操作。我有一些可行的解决方案,但它们似乎是一种使用 pandas 的奇怪方式,或者运行速度有点慢。我相信这必须是一项常见任务,所以我希望可能有一种“适当”的方法来解决它。因为我会经常做这样的事情,所以我想学习它

示例 df:

names = ['john doe', 'jane doe', 'jimmy - tables', 'bobby / tables']
condition_str = ['condition 1', 'condition 1', 'condition 2', 'condition 3']
nums = [1, 2, 3, 4]
df_example = pd.DataFrame({'Name': names, 'Condition': condition_str, 'Numbers': nums})

我想根据一个或多个条件在不同的列上运行多个操作并将其返回到不同的列。在此示例中,将名称拆分为不同的子字符串(“”、“- ”),并将数字乘以不同的值。

这是一个给出正确输出的函数:

def split_name_condition(row):
if row['Condition'] == 'condition 1':
first_name, last_name = row['Name'].split(' ')
nums2 = row['Numbers'] * 2
return [first_name, last_name, nums2]
elif row['Condition'] == 'condition 2':
nums2 = row['Numbers'] * 10
first_name, last_name = row['Name'].split(' - ')
return [first_name, last_name, nums2]
else: # needs explicit two return values for the append in iter_lists()
return None, None, None

我可以使用 apply 运行它:

def run_apply(df):
df[['first_name', 'last_name', 'Number2']] = df.apply(split_name_condition, axis=1, result_type='expand')
return df

或者使用iterrows:

def run_iter_lists(df):
first_name, last_name, numbers2 = [], [], []
for _, row in df.iterrows():
f_name, l_name, nums2 = split_name_condition(row)
first_name.append(f_name)
last_name.append(l_name)
numbers2.append(nums2)

df_result = pd.DataFrame({'first_name': first_name,
'last_name': last_name,
'Numbers2': numbers2})
return pd.concat([df, df_result], axis=1, sort=False)

对 DF 进行迭代对我来说似乎很奇怪。

使用 bool 索引:

def run_bool_index(df):
df.loc[df['Condition'] == 'condition 1', 'list_name'] = df['Name'].str.split(' ')
df.loc[df['Condition'] == 'condition 2', 'list_name'] = df['Name'].str.split(' - ')
df.loc[df['Condition'] == 'condition 3', 'list_name'] = df['Name'].str.split(' / ')

df.loc[df['Condition'] == 'condition 1', 'Numbers2'] = df['Numbers']*2
df.loc[df['Condition'] == 'condition 2', 'Numbers2'] = df['Numbers']*10

df[['first_name', 'last_name']] = pd.DataFrame(df['list_name'].values.tolist())
return df

在我看来,bool 索引更像是 pandas 的预期用途,但与 apply 和 iterrows 相比非常慢。

100 次执行的 timeit 结果:

apply:
0.20913150000000025
iter_lists:
0.16314859999999998
bool_index:
0.7845151000000001

对于此类任务有没有通用的解决方案或最佳实践?

最佳答案

您可以尝试:

def myfunc(df):
df['list_name']=df['Name'].str.findall('\w+')
df['Numbers2']=(np.select([df['Condition'].eq('condition 1'),df['Condition']
.eq('condition 2')],[df['Numbers']*2,df['Numbers']*10]))
df[['first_name', 'last_name']]=df['Name'].str.extract('(\w+)\W+(\w+)')
return df

关于python - pandas 根据条件执行操作 - 不同的方式和最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57005679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com