如果所选列中的值大于列"Col 7"中的值,如何将每个项的第二小值添加到DF中,仅从字典对应的列中并在计算第二小值时具有条件?

import pandas as pd
my_dict={'Item1':['Col1','Col3','Col6'],
'Item2':['Col2','Col4','Col6','Col8'],
'Item3':['Col1','Col3','Col6']
        }
df=pd.DataFrame({
            'Col0':['Item1','Item2','Item3'],
            'Col1':[20,25,28],
            'Col2':[89,15,35],
            'Col3':[36,30,96],
            'Col4':[40,108,13],
            'Col5':[55,2,9],
            'Col6':[35,38,27],
            'Col7':[30,20,39],
            })

结果应该是:

df=pd.DataFrame({
            'Col0':['Item1','Item2','Item3'],
            'Col1':[20,25,28],
            'Col2':[89,15,35],
            'Col3':[36,30,96],
            'Col4':[40,108,13],
            'Col5':[55,2,9],
            'Col6':[35,38,27],
            'Col7':[30,20,39],
            'second min':[36,108,'NaN']
            })

推荐答案

我会使用一个自定义函数在groupby.apply中使用,并获得第二大的numpy.partition:

def get_nth(g, N=2):
    tmp = g.reindex(columns=my_dict.get(g.name))
    return pd.Series(np.partition(tmp.where(tmp.ge(g['Col7'], axis=0)),
                                  N-1, axis=1)[:, N-1], index=g.index)

df['second min'] = (df.groupby('Col0', group_keys=False)
                      .apply(get_nth, include_groups=False)
                    )

使用使用str.get_dummiesmerge制作的面具进行了相同的方法:

mask = (pd.Series({k: '|'.join(v) for k, v in my_dict.items()})
          .str.get_dummies().astype(bool)
          .reindex(df['Col0']).set_axis(df.index)
       )

tmp = df.drop(columns=['Col0'])

N = 2
df['second min'] = np.partition(tmp.where(mask & tmp.gt(tmp['Col7'], axis=0)),
                                N-1)[:, N-1]

输出:

    Col0  Col1  Col2  Col3  Col4  Col5  Col6  Col7  second min
0  Item1    20    89    36    40    55    35    30        36.0
1  Item2    25    15    30   108     2    38    20       108.0
2  Item3    28    35    96    13     9    27    39         NaN

Python相关问答推荐

强制venv在bin而不是收件箱文件夹中创建虚拟环境

symy.分段使用numpy数组

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

将图像拖到另一个图像

如何在polars(pythonapi)中解构嵌套 struct ?

对所有子图应用相同的轴格式

ODE集成中如何终止solve_ivp的无限运行

使用密钥字典重新配置嵌套字典密钥名

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

在matplotlib中删除子图之间的间隙_mosaic

在Python中使用if else或使用regex将二进制数据如111转换为001""

将scipy. sparse矩阵直接保存为常规txt文件

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

用两个字符串构建回文

如果有2个或3个,则从pandas列中删除空格

如何合并具有相同元素的 torch 矩阵的行?

Tensorflow tokenizer问题.num_words到底做了什么?

有没有办法让Re.Sub报告它所做的每一次替换?

比较两个有条件的数据帧并删除所有不合格的数据帧