我想对Dataframe中的几个列应用一个小方法。color_negative方法不能应用于字符串列,因此我需要跳过这些列。我可以想到两种方法来解决这个问题,但遗憾的是没有一种方法有效。
*在办法1中:
我尝试通过使用Dataframe的索引并将while循环的递增计数器设置为1,将方法逐个应用于每一列(跳过第一列)。在执行此方法时,我得到了错误,即“Series”对象没有属性“style”,因此显然,我无法将方法应用于单个列。
*在办法2中:
我尝试使用subset来将该方法仅应用于那些具有数值的列,尽管我不确定是否正确使用了subset。在执行此方法时,我得到了类型为'Styler'的对象没有len()
的错误。
下面是一个简化的示例:
import pandas as pd
d = {'col1': ['a', 'b'], 'col2': [21, 22], 'col3': [3, 51]}
df = pd.DataFrame(data=d)
def color_negative_red(val):
color = 'black'
if val < -1 : color = 'red'
if val > 1 : color = 'green'
return 'color: %s' % color
i=1
while i <= len(df):
#Approach 1
df.iloc[:, i] = df.iloc[:, i].style.applymap(color_negative_red)
#Approach 2
df = df.style.applymap(color_negative_red, subset = df.iloc[:, i])
i+=1
df
有人对如何解决这个问题有什么建议吗?
3条答案
按热度按时间0yycz8jy1#
您可以选择所需的列,然后对它们执行
applymap
,如下所示:如果需要,可以筛选出字符串列
ujv3wf0j2#
您可以将
style.Styler.apply
与DataFrame of styles
和numpy.select
配合使用来填充:dgenwo3n3#
对函数进行矢量化
然后可以使用简单的
apply
,同时根据需要按列名进行过滤: