根据值列熊猫对名称进行计数

时间:2020-06-20 11:45:32

标签: python pandas

对于以下数据框,基于两个植物上覆盖的颜色名称,希望创建一个新列,如果两个植物中都存在颜色,则计算为1,否则为0:

df:

Color      Plant
green1     1
blue2      1
red1       1
purple6    2
blue2      1
blue3      2
green1     2
green1     1
red2       1
purple6    1       

所需的输出:

Color      Plant   Spillover
green1     1       1
blue2      1       0
red1       1       0
purple6    2       1
blue2      1       0
blue3      2       0
green1     2       1
green1     1       1
red2       1       0
purple6    1       1

3 个答案:

答案 0 :(得分:1)

这是一个解决方案:

df["Spillover"] = df.groupby("Color").transform(lambda x: 1 in list(x) and 2 in list(x)).astype(int)

输出为:

     Color  Plant  Spillover
0   green1      1          1
1    blue2      1          1
2     red1      1          0
3  purple6      2          1
4    blue2      2          1
5    blue3      2          0
6   green1      2          1
7   green1      1          1
8     red2      1          0
9  purple6      1          1

如果您有多个工厂,并且不喜欢if语句的“和”部分,则可以执行以下操作:

s = set([1,2]) # list of relevant plants
df["Spillover"] = df.groupby("Color").transform(lambda x: s.issubset(set(x))).astype(int)

答案 1 :(得分:1)

我们可以使用GroupBy.nunique来检查每种颜色的唯一植物数量。如果这些是> 1,则工厂之间会有溢出:

df['Spillover'] = df['Color'].map(df.groupby('Color')['Plant'].nunique()).gt(1).astype(int)

     Color  Plant  Spillover
0   green1      1          1
1    blue2      1          0
2     red1      1          0
3  purple6      2          1
4    blue2      1          0
5    blue3      2          0
6   green1      2          1
7   green1      1          1
8     red2      1          0
9  purple6      1          1

答案 2 :(得分:1)

使用Color上的DataFrame.groupby,然后在.transform列上使用Plant来计算与给定颜色关联的唯一植物的数量,然后创建布尔蒙版{{ 1}},其中具体值对应于唯一植物大于1的条件,然后使用np.where基于此掩码m选择10

m

m = df.groupby('Color')['Plant'].transform('nunique').gt(1)
df['Spillover'] = np.where(m, 1, 0)