gpt4 book ai didi

python - 我需要比较同一数据框中的列并对它们进行排名

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:46 24 4
gpt4 key购买 nike

我有一个包含 6 列的数据框,我需要将每 3 列与其他三列进行比较。 6 列是相同的数据,但前 3 列的值来自一种方法,其他三列来自其他方法。所以我需要比较它们的差异或变化。

Df.head()

A B C A-1 B-1 C-1
190 289 300 190 287 267

我的条件是,

conditions = [(combined_min['A'] == combined_min['A-1']) & (combined_min['B'] == combined_min['B-1'] & combined_min['C'] == combined_min['C-1']),
(combined_min['A'] > combined_min['A-1']) & (combined_min['B'] > combined_min['B-1'] & combined_min['C'] > combined_min['C-1']),
(combined_min['A'] < combined_min['A-1']) & (combined_min['B'] < combined_min['B-1'] & combined_min['C'] < combined_min['C-1'])]

我的选择是,

choices     = [ "same", 'kj_greater', 'mi_greater' ]

然后我试了一下,

combined_min['que'] = np.select(conditions,choices, default=np.nan)

但是它抛出错误信息,

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

最后我需要这样一个数据框,

  A    B    C  A-1  B-1  C-1         que
190 289 300 190 287 267 kj_greater

如果 A、B 和 C 列高于 kj_greater,否则 mi_greater,如果所有 6 列都相同则相同。

最佳答案

编辑

经过一些挖掘/反射(reflection),我意识到我错了:事实证明 & Pandas 中的逻辑运算符。 &实现成对逻辑和 pd.Series 之间和 pd.DataFrame对象。不幸的是,&运算符优先级与 and 不同, 所以你必须小心使用它(在这种情况下, & 的优先级高于 ==>< )。 OP 代码中的错误归结为在正确的位置缺少括号。

因此,要获得 OP 最初使用的那种标签,代码为:

import numpy as np
import pandas as pd

data= [
[191, 289, 300, 190, 287, 267],
[191, 289, 300, 200, 312, 400],
[191, 289, 300, 191, 289, 300],
[191, 289, 300, 200, 287, 400],
]
combined_min = pd.DataFrame(data=data, columns=['A', 'B','C','A-1','B-1','C-1'])

cond = lambda x: [(x['A'] == x['A-1']) & (x['B'] == x['B-1']) & (x['C'] == x['C-1']),
(x['A'] > x['A-1']) & (x['B'] > x['B-1']) & (x['C'] > x['C-1']),
(x['A'] < x['A-1']) & (x['B'] < x['B-1']) & (x['C'] < x['C-1'])]
choices = ['same', 'kj_greater', 'mi_greater']

combined_min['que'] = np.select(cond(combined_min), choices, default=np.nan)
print(combined_min)

这个输出:

     A    B    C  A-1  B-1  C-1         que
0 191 289 300 190 287 267 kj_greater
1 191 289 300 200 312 400 mi_greater
2 191 289 300 191 289 300 same
3 191 289 300 200 287 400 nan

可选,cond可以归结为一行:

from functools import reduce
from operator import eq, gt, lt, and_

cond = lambda x: [reduce(and_, (op(x[c], x['{}-1'.format(c)]) for c in 'ABC')) for op in (eq, gt, lt)]

尽管这在一定程度上降低了可读性。

关于python - 我需要比较同一数据框中的列并对它们进行排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com