Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用apply for two column including list(包括列表)在一列中使用另一列中的元素返回列表中的索引?_Python_Pandas_Dataframe_Apply_Python Applymap - Fatal编程技术网

Python 如何使用apply for two column including list(包括列表)在一列中使用另一列中的元素返回列表中的索引?

Python 如何使用apply for two column including list(包括列表)在一列中使用另一列中的元素返回列表中的索引?,python,pandas,dataframe,apply,python-applymap,Python,Pandas,Dataframe,Apply,Python Applymap,我有一个熊猫数据框,列为“a”和“b”。列a有一个值列表作为列值,列“b”有一个列表,其中包含一个可能出现在列“a”中的值。我想在a列和b列的基础上创建一个新的c列,该列的值为元素在b中的位置,该位置显示在a列的值中,使用apply。(c:(a中b的索引)+1) 列b始终是一个包含一个元素或根本没有元素的列表,列a可以是任意长度的,但如果它为空,则列b也将为空。列b元素应该在列a中,我只想找到它在列a中第一次出现的位置 a b

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


通过读取数据,使数据类型为列表,我能够创建一个应用函数,该函数为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()
的基本方法

将熊猫作为pd导入
将numpy作为np导入
列表a=['1','2','5'],['2','3','4'],['2','3','4'],[]
列表b=['2'],['4'],[],[]
df_1=pd.DataFrame(data=zip(列表a,列表b),列=['a','b'])
df_1['a']=df_1['a'].map(λx:x如果x否则np.NaN)
df_1['b']=df_1['b'].map(lambda x:x[0]如果x否则np.NaN)
#df_1['b']=df_1['b'].map(lambda x:next(iter(x),np.NaN))
def计算(当前行:pd.系列)->int:
如果当前行['a']为np.NaN或当前行['b']为np.NaN:
返回0
其他:
返回当前行['a']。索引(当前行['b'])
df_1['c']=df_1['a',b']]。应用(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
,我发现它更加习惯和实用


这显然不是一个理想的解决方案,我将尝试寻找其他解决方案。显然,关于您的程序和数据帧的信息越多越好。

所有列表的大小是否相同?您的数据帧来自哪里?我们可能需要更多的代码,可能需要一些示例数据。请参阅:。另外,为什么要在基于一个的索引中显示结果?您的代码创建了一列
'd'
,但是您在解释中没有提到它。感谢您提到它,d列只是为了计算b中的元素在a列中出现的次数,但是如果我知道如何创建c列,我也可以对d列做同样的事情,这就是为什么我没有提到它的原因。好吧,这是有道理的。我明天会看一看,我相信我们能找到一个好的解决办法。同时,如果你有任何想法,请添加更多细节,嗯。数据帧的格式和周围的代码可以极大地改变哪种解决方案是最好的。谢谢,在此期间我将添加更多细节以使其更清楚。这里的
eval()
真的是最佳选择吗?熊猫将数据类型视为一个我无法转换的对象,所以我选择了eval。直到,我能想出如何在没有评估的情况下转换它们,这是我能想出如何实现这个目标的最好方法。我为我所有的熊猫图案保留了一个文本文件,当我有更好的答案时对它们进行修改。我改变了它的工作方式,apply函数现在不进行求值,但我们确实将列表作为求值读取。我的另一个建议是使用.apply(eval)作为解决方案,因此这也可能是一个选项。您如何将
eval()
用于操作本身?如果您以我的方式读取数据,我就不知道如何使用eval获取列表。我正在扩展我在应用函数方面的知识,你的回答在这方面帮助了我。这就是我喜欢stackoverflow的地方,不断地学习新东西,为我的图书馆建立更好的模式。这帮助我找到了另一个我正在研究的模式,谢谢Alexander,这是一个很好的答案+1@oppressionslayer如果不是太麻烦的话,你能分享一下模式吗?我很好奇:)我在弄清楚如何在应用函数中动态处理列时遇到了麻烦,但现在我看到我可以将它们作为键(从curr_行)dict_键({“a”:[“1”,“2”,“5”],“c”:1})#-->dict_键(['a”,“c']),所以现在我可以在一般情况下制作更好的应用函数。关于pandas的很多问题没有得到回答,似乎是因为缺少了一个神奇的一行,但是有了动态列应用函数,我想我可以对以前无法回答的问题做出一些很好的回答,我不知道你可以这样构造函数,所以这非常有帮助。未来我可能会有几个问题问你是的,非常清楚,它运行得非常好,比我现有的for循环快得多。非常感谢。