对熊猫数据框应用/映射功能以检索新列

时间:2018-07-18 22:45:28

标签: python-3.x pandas dataframe apply series

说我有一个熊猫数据框,其中的“路径”列指定了图像文件的路径。

我还有一个函数f,例如“ get_info”,该函数进行api调用并输出“ a”,“ b”和“ c”。

我现在想将f应用于我的数据框,并以创建带有输出'a','b'和'c'的新列作为回报。我想用10行的垃圾邮件来做,以保存中间结果(因为该函数使请求需要一些时间才能完成,并且数据帧有很多行)。

我想要的输出可能是这样的数据帧:

        x             a                   b                    c      
35      'path1'       [[some lists]]       [[some lists]]      [[some lists]]      
1       'path2'       NaN                  NaN                 NaN       
362     'path3'       [[some lists]]       [[some lists]]      [[some lists]]      

首先,我尝试了以下代码:

df['a']=np.nan
df['b']=np.nan
df['c']=np.nan

for i in range(0, len(df),10):
    try:
        df[['a','b','c']].iloc[i:(i+10)]= df['path'].iloc[i:(i+10)].apply(get_info).apply(pd.Series)
    except:
        print("Unexpected error:", sys.exc_info()[1])

但是,这产生了一个数据框,其中的列“ a”,“ b”,“ c”都仅用NaN填充。但是,如果我只运行

df['path'].iloc[0:(0+10)].apply(get_info).apply(pd.Series)

输出与预期的一样(具有“ a”,“ b”,“ c”列的数据框)

然后我尝试:

df['a']=np.nan
df['b']=np.nan
df['c']=np.nan

for i in range(0, len(df),10):
    try:
        df['a'].iloc[i:(i+10)], df['b'].iloc[i:(i+10)], df['c'].iloc[i:(i+10)]\
        = zip(*df['path'].iloc[i:(i+10)].map(get_info))
        df.to_pickle('somepath')
    except:
        print("Unexpected error:", sys.exc_info()[i])

对于此代码,我会遇到以下错误

TypeError: zip argument #1 must support iteration

IndexError: tuple index out of range

编辑:根据@ pshep123的请求,此处为该功能的代码:

def get_info(path): 
    data = open(path, 'rb') 

    retries =0   
    while retries < 2:
        try:        
         # Execute the REST API call and get the response.
            response = requests.request('POST', uri_base + '/detect', data=data, headers=headers, params=params)
            faces = json.loads(response.text)                    
            a=[]
            b=[]
            c=[]
            for face in faces:
                a.append(face['faceAttributes']['emotion']['anger'])
                b.append(face['faceAttributes']['emotion']['contempt'])
                c.append(face['faceAttributes']['emotion']['disgust'])               
            return a, b, c

        except: 
            if retries <2:
                time.sleep(60) 
                retries+=1
            else:
                return np.nan

    return np.nan   

有人可以帮忙吗?

0 个答案:

没有答案