将方法应用于熊猫数据框中的一些选定列

时间:2018-07-12 13:05:30

标签: python pandas dataframe

我想对Dataframe中的几列应用一点方法。 color_negative方法无法应用于带有字符串的列,因此我需要以某种方式跳过这些列。我可以想到两种解决问题的方法,尽管遗憾的是没有一种方法可行。

  • 在方法1中:

    我尝试通过使用Dataframe的索引并将while循环的递增计数器设置为1,逐个跳过每一列,将方法应用于每一列。执行此方法时,我得到了错误, “系列”对象没有属性“样式”,因此,显然,我无法将方法应用于单个列。

  • 在方法2中:

    尽管我不确定是否正确使用了子集,但我尝试使用子集将方法仅应用于具有数值的列。当执行这种方法时,我得到一个错误,即“ 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

有人对如何解决这个问题有建议吗?

2 个答案:

答案 0 :(得分:0)

您可以选择所需的列,然后在其上var zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); ,如下所示:

applymap

如果需要,可以过滤掉字符串列

column_names = ['name_a','name_b']
df[column_names] = df[column_names].applymap(my_func)

答案 1 :(得分:0)

您可以将style.Styler.applyDataFrame of stylesnumpy.select配合使用:

d = {'col1': ['a', 'b'], 'col2': [21, 22], 'col3': [0, -51]}
df = pd.DataFrame(data=d)

def color_negative_red(x):
    #select only numeric columns
    x1 = x.select_dtypes(np.number)
    c1 = 'color: red'
    c2 = 'color: green'
    c3 = '' 
    #boolean masks
    m1 = x1 < -1
    m2 = x1 > 1
    #numpy array by conditions
    arr = np.select([m1, m2], [c1, c2], default=c3)
    df1 =  pd.DataFrame(arr, index=df.index, columns=x1.columns)
    #added strings columns filled by c3 string 
    df1 = df1.reindex(columns=x.columns, fill_value=c3)
    return df1

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

pic