3

对于以下数据框,基于覆盖两种植物的颜色名称,希望创建新列,如果两种植物中都存在颜色,则计数为 1,如果不是这种情况,则计数为 0:

东风:

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
4

3 回答 3

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)
于 2020-06-20T11:53:13.940 回答
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
于 2020-06-20T11:59:24.737 回答
1

使用,然后在列DataFrame.groupby上使用来计算与给定颜色相关联的唯一植物的数量,然后创建一个布尔掩码,其中真实值对应于唯一植物大于 1 的条件:然后用于选择或基于此掩码。Color.transformPlantmnp.where10m

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

df
     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
于 2020-06-20T12:01:41.560 回答