pandas 当我们把元素作为列表时,如何基于行和列比较元素?

kiayqfof  于 2022-11-05  发布在  其他
关注(0)|答案(3)|浏览(154)

我有一个数据框,每一列是一个有3个元素的列表。我如何比较每个列表的第二个元素基于每一列和行?

Col1   col2    col3
['A',0.2,5]  ['A',0.4,5]  ['A',0,5]
['A',0.4,5]  ['A',0.2,5]  ['A',0.7,5]
['A',0.1,5]  ['A',0.1,5]  ['A',0.20,5]
['A',0.25,5]  ['A',0.9,5]  ['A',0.22,5]

列中第二个元素的最大值,基于:

col1=0.4
col2=0.9
col3=0.22

第二个元素的最大值,以行为基础:

row1=0.2
row2=0.7
row3=0.20
row4=0.9
qij5mzcb

qij5mzcb1#

使用applymap从列表中提取第二个元素,然后使用axis获取列或行中的最大值:

new_df = df.applymap(lambda x: x[1])

# rows

new_df.max(axis=1)

# columns

new_df.max()
qqrboqgw

qqrboqgw2#

另一种可能的解决方案:

def mymax(x):
    return max([y[1] for y in x])

df.apply(mymax)
df.apply(mymax, axis=1)

编辑

下面的代码尝试回答下面的OP注解:

def imax(x):
    return np.argmax([y[1] for y in x])

df.apply(imax)
df.apply(imax, axis=1)

# in case, we want the column names

df.columns[df.apply(imax, axis=1)].tolist()
pqwbnv8z

pqwbnv8z3#

对于矢量解决方案,您可以在所需级别上执行stack、切片和groupby.max

对于行:

df.stack().str[1].groupby(level=0).max()

输出量:

0    0.4
1    0.7
2    0.2
3    0.9
dtype: float64

对于色谱柱:

df.stack().str[1].groupby(level=1).max()

输出量:

Col1    0.4
col2    0.9
col3    0.7
dtype: float64

相关问题