【问题标题】:How to add flag column in each group of pandas groupby object如何在每组熊猫 groupby 对象中添加标志列
【发布时间】:2020-03-23 16:17:37
【问题描述】:

我有三列 XYZ 的 df。我想应用 groupby 函数来根据 X 对数据进行分组。然后我想在每个组中插入flag 列。标志列的条件是,如果 Column Z 30% 的值大于 1.5,则为 group 添加标志列值 1。如果 Column Z 30% 的值不大于 1.5,则为 group 添加标志列值 0 。

这是我的例子 df:

 df = pd.DataFrame({'X':['1', '1', '1' ,'1', '1', '2','2','2','2','2','2','3','3','3'],'Y':["34","45","33","45","44", "66",'67','23','34','10','11','13','12','14'],'Z':["1.2","1.3","1.6","1.7","1.8", "0",'0','0','1.8','1.2','1.3','1.6','1.7','1.8']})
      X   Y    Z
0   1  34  1.2
1   1  45  1.3
2   1  33  1.6
3   1  45  1.7
4   1  44  1.8
5   2  66    0
6   2  67    0
7   2  23    0
8   2  34  1.8
9   2  10  1.2
10  2  11  1.3
11  3  13  1.6
12  3  12  1.7
13  3  14  1.8

想要的结果:

df_result= pd.DataFrame({'X':['1', '1', '1' ,'1', '1', '2','2','2','2','2','2','3','3','3'],'Y':["34","45","33","45","44", "66",'67','23','34','10','11','13','12','14'],'Z':["1.2","1.3","1.6","1.7","1.8", "0",'0','0','1.8','1.2','1.3','1.6','1.7','1.8'],'flag':["1","1","1","1","1", "0",'0','0','0','0','0','1','1','1']})
print(df_result)
  X   Y    Z flag
0   1  34  1.2    1
1   1  45  1.3    1
2   1  33  1.6    1
3   1  45  1.7    1
4   1  44  1.8    1
5   2  66    0    0
6   2  67    0    0
7   2  23    0    0
8   2  34  1.8    0
9   2  10  1.2    0
10  2  11  1.3    0
11  3  13  1.6    1
12  3  12  1.7    1
13  3  14  1.8    1

【问题讨论】:

    标签: python-3.x pandas numpy pandas-groupby apply


    【解决方案1】:

    GroupBy.transform 与lambda 函数一起使用,并通过Series.astype 将布尔值转换为整数:

    df["Z"]= df["Z"].astype(float)
    
    f = lambda x: (x > 1.5).sum() > len(x) *.3
    #if necessary convert 30% to integer by ceil
    #f = lambda x: (x > 1.5).sum() > np.ceil(len(x) *.3)
    df['flag'] = df.groupby("X")["Z"].transform(f).astype(int)
    print (df)
        X   Y    Z  flag
    0   1  34  1.2     1
    1   1  45  1.3     1
    2   1  33  1.6     1
    3   1  45  1.7     1
    4   1  44  1.8     1
    5   2  66  0.0     0
    6   2  67  0.0     0
    7   2  23  0.0     0
    8   2  34  1.8     0
    9   2  10  1.2     0
    10  2  11  1.3     0
    11  3  13  1.6     1
    12  3  12  1.7     1
    13  3  14  1.8     1
    

    【讨论】:

      【解决方案2】:

      试试这个。如果有任何问题请告诉我。

      import pandas as pd
      import math
      df = pd.DataFrame({'X':['1', '1', '1' ,'1', '1', '2','2','2','2','2','2','3','3','3'],'Y':["34","45","33","45","44", "66",'67','23','34','10','11','13','12','14'],'Z':["1.2","1.3","1.6","1.7","1.8", "0",'0','0','1.8','1.2','1.3','1.6','1.7','1.8']})
      df["Z"]= pd.to_numeric(df["Z"])
      def func(x):
          p = math.ceil(x.shape[0]*3/10)
          if sum(x>1.5) > p:
              return 1
          else:
              return 0
      
      t = df.groupby("X")["Z"].apply(lambda x: func(x)).reset_index(name="flag")
      df["flag"] = df["X"].apply(lambda x: t[t["X"]==x]["flag"].values[0])
      

      输出

         X   Y    Z  flag
         1  34  1.2     1
         1  45  1.3     1
         1  33  1.6     1
         1  45  1.7     1
         1  44  1.8     1
         2  66  0.0     0
         2  67  0.0     0
         2  23  0.0     0
         2  34  1.8     0
         2  10  1.2     0
         2  11  1.3     0
         3  13  1.6     1
         3  12  1.7     1
         3  14  1.8     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-03
        • 2016-01-13
        • 1970-01-01
        • 2021-11-19
        • 2019-02-24
        • 2021-11-07
        • 2016-10-31
        • 1970-01-01
        相关资源
        最近更新 更多