基于值列计算名称(Pandas)

3

对于下面的数据框,基于两个工厂中涵盖的颜色名称,寻求创建新列,如果颜色在两个工厂中都存在,则计数为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

1
您的数据似乎存在不一致。在原始数据框中,Blue2 在工厂1和2中,但在输出数据框中,Blue2 与1关联了两次,并且溢出为0。 - sammywemmy
1
“Plant”列在输入和期望输出中不匹配? - Shubham Sharma
颜色可以在多行中多次出现。因此,蓝色2出现了2次,但仅在工厂1中,并且得到0分。 - ryp6
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语句中的“and”部分,可以这样做:
s = set([1,2]) # list of relevant plants
df["Spillover"] = df.groupby("Color").transform(lambda x: s.issubset(set(x))).astype(int)

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

1
使用 DataFrame.groupbyColor 上,然后在列 Plant 上使用 .transform 计算与给定颜色相关的唯一植物数量,然后创建一个布尔掩码 m,其中真值对应于唯一植物大于1的条件:然后使用 np.where 基于此掩码 m 选择 10
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接