Флаг, если столбец в Dataframe с другими строками существует в другом столбце - PullRequest
1 голос
/ 20 января 2020

У меня есть фрейм данных:

Number   Items
 1        1,3,7
 2        1,2,7
 3        4,5
 4        9

Мне нужно пометить, если в столбце Number для каждой строки есть какое-либо из значений Items.

Вывод должен быть:

Number   Items      Flag
 1        1,3,7      True
 2        1,2,7      True  
 3        4,5        False
 4        9          False

Я попробовал следующее: df['Flag'] = df.items.isin(df.Number)

Это работает, когда в столбце Items есть только одно значение. Мне нужно учитывать несколько значений, чтобы 1,3,7 проверялось по отдельности, а не только как целое.

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Я бы использовал zip и понимание списка

df['Flag'] = [str(num) in lis for num, lis in zip(df.Number, df.Items)]

   Number  Items   Flag
0       1  1,3,7   True
1       2  1,2,7   True
2       3    4,5  False
3       4      9  False

Обратите внимание, что его операция O(N*max(I)), которая может быть очень медленной, как число строк N растет и по мере роста размеров списка I. В зависимости от того, как структурированы ваши данные, вы, вероятно, захотите пересмотреть структуру ваших данных.

1 голос
/ 20 января 2020

Мы можем сделать split с isin

df.Items.str.split(',', expand=True).isin(df.Number.astype(str)).any(1)
0     True
1     True
2    False
3    False
dtype: bool
1 голос
/ 20 января 2020

Мы могли бы использовать

df['Flag'] = df.apply(lambda x: str(x['Number']) in x['Items'],axis = 1)

или

df['Flag'] = (df['Items'].str.split(',').explode()
                             .eq(df['Number']
                             .astype(str))
                             .any(level = 0) )

Выход

   Number  Items   Flag
0       1  1,3,7   True
1       2  1,2,7   True
2       3    4,5  False
3       4      9  False
...