2017-04-13 52 views
3

我试图从apply方法返回两个不同的值,但我无法弄清楚如何获得我需要的结果。从熊猫获取两个返回值应用

与函数为:

def fun(row): 
    s = [sum(row[i:i+2]) for i in range (len(row) -1)] 
    ps = s.index(max(s)) 
    return max(s),ps 

df为:

6:00 6:15 6:30  
0 3  8  9  
1 60  62  116  

我试图返回行的最大价值,但我也需要得到的指数第一个产生最大组合的值。

df["phour"] = t.apply(fun, axis=1) 

我可以输出我需要的,但我不知道我怎样才能在新column.So远IM在tuple

6:00 6:15 6:30 phour 
0 3  8  9  (17, 1) 
1 60  62  116  (178, 1) 

怎样才能让这两个答案索引我在它自己的列中获得索引值?

+0

的可能的复制[从大熊猫返回多个值适用于数据框(HTTP://计算器。 com/questions/10751127/returns-multiple-values-from-pandas-apply-on-a-dataframe) –

回答

6

您可以applypd.Series

df.drop('Double', 1).join(df.Double.apply(pd.Series, index=['D1', 'D2'])) 

    A B C D1 D2 
0 1 2 3 1 2 
1 2 3 2 3 4 
2 3 4 4 5 6 
3 4 1 1 7 8 

等价

df.drop('Double', 1).join(
    pd.DataFrame(np.array(df.Double.values.tolist()), columns=['D1', 'D2']) 
) 

设置
使用@ GordonBean的df

df = pd.DataFrame({'A':[1,2,3,4], 'B':[2,3,4,1], 'C':[3,2,4,1], 'Double': [(1,2), (3,4), (5,6), (7,8)]}) 
+0

我应该在回答以下问题前仔细查看一下:http://stackoverflow.com/questions/10751127/returning-multiple-values-from-pandas-apply-on-a-dataframe :) –

+0

这是很多清洁器。谢谢@piRSquared。 – user7331243

+1

非常好!但我们可以尝试使它更好:'df.join(df.pop('Double')。apply(pd.Series,index = ['D1','D2']))';-) – MaxU

2

如果你只是想获得最大和argmax,我建议使用熊猫API:

DataFrame.idxmax

所以:

df = pd.DataFrame({'A':[1,2,3,4], 'B':[2,3,4,1], 'C':[3,2,4,1]}) 
df 

    A B C 
0 1 2 3 
1 2 3 2 
2 3 4 4 
3 4 1 1 

df['Max'] = df.max(axis=1) 
df['ArgMax'] = df.idxmax(axis=1) 
df  

    A B C Max ArgMax 
0 1 2 3 3 C 
1 2 3 2 3 B 
2 3 4 4 4 B 
3 4 1 1 4 A 

更新
如果你需要实际的指数值,可以使用numpy.ndarray.argmax

df['ArgMaxNum'] = df[['A','B','C']].values.argmax(axis=1) 


    A B C Max ArgMax ArgMaxNum 
0 1 2 3 3 C 2 
1 2 3 2 3 B 1 
2 3 4 4 4 B 1 
3 4 1 1 4 A 0 
+0

我需要得到最大的结果每行的价值。以第一行为例,我需要选择11到17之间,并知道最大序列的索引从哪里开始 – user7331243

+0

啊,我明白了。我会添加另一个答案。 –

1

我们有了一个更好的办法,但你可以这样做:

df.merge(pd.DataFrame(((i,j) for 
         i,j in df.apply(lambda x: fun(x)).values), 
         columns=['phour','index']), 
     left_index=True,right_index=True) 
+0

感谢您的答案,这也适用,但老实说,我不能明白到底是怎么回事与代码。我可以更好地跟踪@Gordon Bean。 – user7331243

1

一种方式打出元组到单独的列可能是与元组拆包:

df = pd.DataFrame({'A':[1,2,3,4], 'B':[2,3,4,1], 'C':[3,2,4,1], 'Double': [(1,2), (3,4), (5,6), (7,8)]}) 
df 


    A B C Double 
0 1 2 3 (1, 2) 
1 2 3 2 (3, 4) 
2 3 4 4 (5, 6) 
3 4 1 1 (7, 8) 

df['D1'] = [d[0] for d in df.Double] 
df['D2'] = [d[1] for d in df.Double] 
df 


    A B C Double D1 D2 
0 1 2 3 (1, 2) 1 2 
1 2 3 2 (3, 4) 3 4 
2 3 4 4 (5, 6) 5 6 
3 4 1 1 (7, 8) 7 8 
+0

感谢这工作。这可能不是最好和更推荐的方法,但它足以满足我的需要。 – user7331243