【问题标题】:Create three new Columns with Pandas DataFrame使用 Pandas DataFrame 创建三个新列
【发布时间】:2019-02-17 10:05:27
【问题描述】:

我在下面有一个数据框,并尝试创建更大、更少和计数的三个新列。条件是计算有多少值大于/小于平均值并将它们相加。

df = 
            APPL       Std_1       Std_2       Std_3          Mean
       0   ACCMGR      106.8754    130.1600    107.1861    114.750510
       1   ACCOUNTS    121.7034    113.4927    114.5482    116.581458
       2   AUTH        116.8585    112.4487    115.2700    114.859050

def make_count(comp_cols, mean_col):
    count_d = {'greater': 0, 'less': 0}
    for col in comp_cols:
        if col > mean_col:
            count_d['greater'] += 1
        elif col < mean_col:
            count_d['less'] += 1
    return count_d['greater'], count_d['less'], (count_d['greater'] + count_d['less'])


def apply_make_count(df):
    a,b,c,*d= df.apply(lambda row: make_count([row['Std_1'], row['Std_2'], row['Std_3']], row['Mean of Std']), axis=1)
    df['greater'],df['less'],df['count']=a,b,c

apply_make_count(df)

但我得到了错误显示:

13     df['greater'],df['less'],df['count']=list(zip(a,b,c))


ValueError: Length of values does not match length of index

我想成为的输出

 df = 
    APPL       Std_1       Std_2       Std_3      Mean  greater less    count
0   ACCMGR      106.8754    130.1600    107.1861    114.750510        1    2        3
1   ACCOUNTS    121.7034    113.4927    114.5482    116.581458        1    2        3
2   AUTH        116.8585    112.4487    115.2700    114.859050        2    1        3

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    试试

    df['greater'] = (df.iloc[:, 1:4].values > df[['Mean']].values).sum(axis=1)
    
    df['less'] = (df.iloc[:, 1:4].values < df[['Mean']].values).sum(axis=1)
    
    df['count'] = df.iloc[:, 1:4].count(1)
    
    
        APPL        Std_1       Std_2       Std_3       Mean       greater  less    count
    0   ACCMGR      106.8754    130.1600    107.1861    114.750510  1       2       3
    1   ACCOUNTS    121.7034    113.4927    114.5482    116.581458  1       2       3
    2   AUTH        116.8585    112.4487    115.2700    114.859050  2       1       3
    

    【讨论】:

      【解决方案2】:

      看来你只需要

      sub_df = df[['Std_1', 'Std_2', 'Std_3']]
      
      df['greater'] = sub_df.gt(df.Mean.values).sum(1) # same as (sub_df > df.Mean.values).sum(1)
      df['less']    = sub_df.lt(df.Mean.values).sum(1)
      df['count']   = sub_df.count(1)
      
      
          APPL        Std_1       Std_2       Std_3       Mean        greater less   count
      0   ACCMGR      106.8754    130.1600    107.1861    114.750510  1       2      3
      1   ACCOUNTS    121.7034    113.4927    114.5482    116.581458  1       2      3
      2   AUTH        116.8585    112.4487    115.2700    114.859050  2       1      3
      

      【讨论】:

        猜你喜欢
        • 2021-04-15
        • 2023-01-10
        • 1970-01-01
        • 2019-05-05
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-30
        相关资源
        最近更新 更多