gpt4 book ai didi

python - 如何使用 apply 两个 pandas 列(包括列表)来使用另一列中的元素返回一列列表中的索引?

转载 作者:行者123 更新时间:2023-12-01 00:21:19 25 4
gpt4 key购买 nike

我有一个 pandas Dataframe,其中包含“a”和“b”列。列 a 具有作为列值的值列表,列“b”具有包含可能出现在列“a”中的单个值的列表。我想基于 a 列和 b 列创建一个新列 c,其中 b 中元素的位置值出现在 a 列值中,使用 apply。 (c: (a 中 b 的索引)+1 )b 列始终是一个包含一个元素或根本没有元素的列表,a 列可以是任意长度,但如果它为空,则 b 列也将为空。 b 列元素预计位于 a 列中,我只想找到它在 a 列中第一次出现的位置。

a                         b                   c 


['1', '2', '5'] ['2'] 2

['2','3','4'] ['4'] 3
['2','3','4'] [] 0
[] [] 0
...

我写了一个 for 循环,它工作正常,但速度很慢:

for i in range(0,len(df)):

if len(df['a'][i])!=0:
df['c'][i]=df['a'][i].index(*df['b'][i])+1
else:
df['c'][i]=0

但是我想使用 apply 来使其更快,以下不起作用,任何想法或建议将不胜感激?

df['c']=df['a'].apply(df['a'].index(*df['b']))

最佳答案

首先,这是使用 .apply() 的基本方法。

import pandas as pd
import numpy as np

list_a = [['1', '2', '5'], ['2', '3', '4'], ['2', '3', '4'], []]
list_b = [['2'], ['4'], [], []]

df_1 = pd.DataFrame(data=zip(list_a, list_b), columns=['a', 'b'])

df_1['a'] = df_1['a'].map(lambda x: x if x else np.NaN)
df_1['b'] = df_1['b'].map(lambda x: x[0] if x else np.NaN)
#df_1['b'] = df_1['b'].map(lambda x: next(iter(x), np.NaN))


def calc_c(curr_row: pd.Series) -> int:
if curr_row['a'] is np.NaN or curr_row['b'] is np.NaN:
return 0
else:
return curr_row['a'].index(curr_row['b'])


df_1['c'] = df_1[['a', 'b']].apply(func=calc_c, axis=1)

df_1 结果:

    a                  b    c
-- --------------- --- ---
0 ['1', '2', '5'] 2 1
1 ['2', '3', '4'] 4 2
2 ['2', '3', '4'] nan 0
3 nan nan 0

我用 NaN 替换了空列表,我发现它更加惯用和实用。

这显然不是一个理想的解决方案,我会尝试寻找其他解决方案。显然,我们拥有的有关您的程序和 DataFrame 的信息越多越好。

关于python - 如何使用 apply 两个 pandas 列(包括列表)来使用另一列中的元素返回一列列表中的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58945752/

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