繁体   English   中英

Pandas 添加一个带有字符串的新列,其中单元格匹配特定条件

[英]Pandas add a new column with a string where the cell match a particular condition

我正在尝试将 Pandas 样式应用于我的数据集,并添加一个带有匹配结果字符串的列。

这就是我想要实现的目标:链接

在此处输入图片说明

下面是我的代码,stackflow 的一位专家帮助我应用了 df.style,所以我相信 df.style 根据我的测试是正确的。 但是,如何运行 iterrows() 并检查每列的单元格并将字符串返回/存储到新列“check”? 非常感谢。 我正在尝试调试但无法显示我想要的内容。

df = pd.DataFrame([[10,3,1], [3,7,2], [2,4,4]], columns=list("ABC"))

df['check'] = None

def highlight(x):
    c1 = 'background-color: yellow'
    m = pd.concat([(x['A'] > 6), (x['B'] > 2), (x['C'] < 3)], axis=1)
    df1 = pd.DataFrame('', index=x.index, columns=x.columns)
    return df1.mask(m, c1)

def check(v):

    for index, row in v[[A]].iterrows():
        if row[A] > 6: 
            A_check = f'row:{index},' + '{0:.1f}'.format(row[A]) + ">6"
            return A_check

    for index, row in v[[B]].iterrows():
        if row[B] > 2:
            B_check = f'row:{index}' + '{0:.1f}'.format(row[B]) + ">2"
            return B_check

    for index, row in v[[C]].iterrows():
        if row[C] < 3:
            C_check = f'row:{index}' + '{0:.1f}'.format(row[C]) + "<3"
            return C_check


df['check'] = df.apply(lambda v: check(v), axis=1)

df.style.apply(highlight, axis=None)

这是我收到的错误消息:

NameError:未定义名称“A”

程序错误很少,我们会一一修正

  1. 导入熊猫
import pandas as pd
  1. 在函数 check(v) 中:var A、B、C 未定义,将它们替换为 'A'、'B'、'C'。 然后 v[['A']] 将成为一个系列,并且要进行系列迭代,我们使用iteritems()而不是 iterrows,而且 index 将是系列中的列名。 更换会给
def check(v):
    truth = []
    for index, row in v[['A']].iteritems():
        if row > 6: 
            A_check = f'row:{index},' + '{0:.1f}'.format(row) + ">6"
            truth.append(A_check)

    for index, row in v[['B']].iteritems():
        if row > 2:
            B_check = f'row:{index}' + '{0:.1f}'.format(row) + ">2"
            truth.append(B_check)

    for index, row in v[['C']].iteritems():
        if row < 3:
            C_check = f'row:{index}' + '{0:.1f}'.format(row) + "<3"
            truth.append(C_check)
    return '\n'.join(truth)

这应该给出预期的输出,尽管您还需要添加额外的逻辑,以便检查列不会变成黄色。 这个答案几乎没有变化,但我建议尝试使用 axis=1 来按列应用样式,因为它看起来更方便。 您也可以参考样式指南在此处输入图片说明

我的理解是,以下内容会产生您尝试使用check函数实现的目标:

def check(v):
    row_str = 'row:{}, '.format(v.name)
    checks = []
    if v['A'] > 6: 
        checks.append(row_str + '{:.1f}'.format(v['A']) + ">6")
    if v['B'] > 2:
        checks.append(row_str + '{:.1f}'.format(v['B']) + ">2")
    if v['C'] < 3:
        checks.append(row_str + '{:.1f}'.format(v['C']) + "<3")    
    return '\n'.join(checks)

df['check'] = df.apply(check, axis=1)

结果( print(df) ):

    A  B  C                                      check
0  10  3  1  row:0, 10.0>6\nrow:0, 3.0>2\nrow:0, 1.0<3
1   3  7  2                 row:1, 7.0>2\nrow:1, 2.0<3
2   2  4  4                               row:2, 4.0>2

(如果您不希望结果中出现换行符,请将\\n替换为' ' 。)

applyaxis=1选项使函数check一行df作为一个系列,其中df的列名作为索引 (-> v )。 使用v.name您将获得相应的行索引。 因此我认为没有必要使用.iter... 我错过了什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM