我有四列值:' A',' B'' C'和' D'和一列包含四个字母中的任何一个。
Letter A B C D max
12063289 D 5 9 0 39 0
12063290 D 3 25 0 79 0
12063291 B 0 232 0 0 0
12063292 A 351 0 0 0 0
12063293 D 0 0 0 394 0
根据字母列的值,我想计算其他三列的最大值。
Letter A B C D max
12063289 D 5 9 0 39 9
12063290 D 3 25 0 79 25
12063291 B 0 232 0 16 16
12063292 A 351 0 200 0 200
12063293 D 0 0 0 394 0
假设上面的数据存储在变量df中,我试图执行以下操作:
import numpy as np
import pandas as pd
columns = {'A':['B','C','D'],
'B':['A','C','D'],
'C':['A','B','D'],
'D':['A','B','C']}
for letter in ['A', 'B', 'C', 'D']:
mask = df.loc[df['Letter']==letter]
np.max(df[mask][columns[letter]], out=df[mask]['max'])
我基本上希望max函数只能处理屏蔽数据帧的相关列,并写回“最大值”。原始数据帧(df)的列恰好位于正确的位置但是pandas在最后一行抱怨:
ValueError: Must pass DataFrame with boolean values only
问题是如何准确地定位那些行的单元格以接收max()函数的输出以便不使用不必要的空间(我可以使用apply函数执行此操作,但它占用了大量空间我没有。)
答案 0 :(得分:1)
apply
cols = list('ABCD')
df.apply(lambda x: x.loc[cols].drop(x.Letter).max(), 1)
12063289 9
12063290 25
12063291 16
12063292 200
12063293 0
dtype: int64
set_index
+ query
+ groupby
d1 = df.set_index(
'Letter', append=True
)[list('ABCD')].rename_axis('Col', 1).stack().to_frame('value')
d1.query('Letter != Col').groupby(level=0).value.max()
12063289 9
12063290 25
12063291 16
12063292 200
12063293 0
dtype: int64