подсчет имен на основе столбца значений pandas - PullRequest
3 голосов
/ 20 июня 2020

Для следующего фрейма данных, на основе названий цветов, покрытых для двух растений, требуется создать новый столбец, который считает 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 ]

1 голос
/ 20 июня 2020

Мы можем использовать 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 голос
/ 20 июня 2020

Используйте, DataFrame.groupby в Color, затем используйте .transform в столбце Plant, чтобы подсчитать количество уникальных растений, связанных с данным цветом, затем создайте логическую маску m, где истинные значения соответствуют условию, когда уникальные растения больше 1: Затем используйте np.where, чтобы выбрать 1 или 0 на основе этой маски m.

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
1 голос
/ 20 июня 2020

Вот решение:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...