我试图从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
as:
6:00 6:15 6:30
0 3 8 9
1 60 62 116
我试图返回行的最大值,但我还需要获取产生最大组合的第一个值的索引。
df["phour"] = t.apply(fun, axis=1)
我可以获得我需要的输出,但我不知道如何在新专栏中获取索引。到目前为止我在tuple
6:00 6:15 6:30 phour
0 3 8 9 (17, 1)
1 60 62 116 (178, 1)
如何在自己的列中获取索引值?
答案 0 :(得分:6)
您可以apply
pd.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&#39; 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)]})
答案 1 :(得分:2)
如果你只是想获得max和argmax,我推荐使用pandas API:
所以:
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
答案 2 :(得分:2)
将元组拆分为单独列的一种方法是使用元组解包:
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
答案 3 :(得分: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)
答案 4 :(得分:0)
您可以像这样在单独的列中获取索引:
df[['phour','index']] = df.apply(lambda row: pd.Series(list(fun(row))), axis=1)
或者,如果您稍微修改一下乐趣:
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[['phour','index']] = df.apply(lambda row: pd.Series(fun(row)), axis=1)