对于以下数据框,基于两个植物上覆盖的颜色名称,希望创建一个新列,如果两个植物中都存在颜色,则计算为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
答案 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
选择1
或0
。>
m
m = df.groupby('Color')['Plant'].transform('nunique').gt(1)
df['Spillover'] = np.where(m, 1, 0)