如何使用apply for two column including list返回一列中的索引,并使用另一列中的元素?

2024-04-25 19:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,列为“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']))


Tags: 数据in元素df列表forindexlen
2条回答

通过读入数据,使数据类型成为列表,我能够创建一个apply函数,该函数为c创建值:

import io, ast

#a b
#['1','2','5'] ['2']
#['2','3','4'] ['4']
#['2','3','4'] []
#[] []

csvfile=io.StringIO("""a b
['1','2','5'] ['2']
['2','3','4'] ['4']
['2','3','4'] []
[] []""")

df = pd.read_csv(csvfile, sep=' ', converters={'a' : ast.literal_eval, 'b' : ast.literal_eval }) 

def a_b_index(hm):
  if hm.b != []:
     return hm.a.index(hm.b[0])
  else:
     return 0

df['c'] = df.apply(a_b_index, axis=1)

df.c
#           a    b  c
#0  [1, 2, 5]  [2]  1
#1  [2, 3, 4]  [4]  2
#2  [2, 3, 4]   []  0
#3         []   []  0

首先,这里是一个使用.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替换了空列表,我发现它更加习惯和实用。你知道吗

这显然不是一个理想的解决方案,我会努力找到别的办法。显然,我们对你的程序和数据帧的了解越多越好。你知道吗

相关问题 更多 >

    热门问题