![](/img/trans.png)
[英]How to add a new column without Length Value error if match where/mask condition after groupby in python/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”
程序错误很少,我们会一一修正
import pandas as pd
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
替换为' '
。)
apply
的axis=1
选项使函数check
一行df
作为一个系列,其中df
的列名作为索引 (-> v
)。 使用v.name
您将获得相应的行索引。 因此我认为没有必要使用.iter...
。 我错过了什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.