как перебирать элементы списка в столбцах данных - PullRequest
0 голосов
/ 12 февраля 2019

Вот мой фрейм данных:

import pandas as pd
df = pd.DataFrame({'animal':['dog','cat','rabbit','pig'],'color':['red','green','blue','purple'],\
               'season':['spring,','summer','fall','winter']})

, и у меня есть список

l = ['dog','green','purple']

с этими фреймом данных и списком, я хочу добавить еще один столбец в df, который на самом деле является результатомесли столбец 'animal' или столбец 'color' соответствуют некоторому элементу l (список).

, значит, желаемый результат (фрейм данных) ниже (я хочу выразить таблицу):

pd.DataFrame({'animal':['dog','cat','rabbit','pig'],
               'color':['red','green','blue','purple'],
               'season':['spring,','summer','fall','winter'],
               'tar_rm':[1,1,0,1] })

Нужно ли повторять список в каждой строке столбца?Я считаю, что одним из преимуществ панд является вещание, но я не уверен, что это возможно здесь ...

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

с использованием numpy

df['tar_rm'] = np.where(df['animal'].isin(l) | df['color'].isin(l), 1, 0)

Вывод

   animal   color   season  tar_rm
0     dog     red  spring,       1
1     cat   green   summer       1
2  rabbit    blue     fall       0
3     pig  purple   winter       1
0 голосов
/ 12 февраля 2019

Использование:

cols = ['animal','color']
df['tar_rm'] = df[cols].isin(l).any(axis=1).astype(int)
print (df)
   animal   color  season  tar_rm
0     dog     red  spring       1
1     cat   green  summer       1
2  rabbit    blue    fall       0
3     pig  purple  winter       1

Подробности :

Сначала сравните отфильтрованные столбцы DataFrame по DataFrame.isin:

print (df[cols].isin(l))
   animal  color 
0    True  False  
1   False   True  
2   False  False   
3   False   True  

Затем проверьте, если хотя бы один True для строк, DataFrame.any:

print (df[cols].isin(l).any(axis=1))
0     True
1     True
2    False
3     True
dtype: bool

Последнее приведенное логическое значение для целых чисел:

print (df[cols].isin(l).any(axis=1).astype(int))
0    1
1    1
2    0
3    1
dtype: int32

Если важна производительность, сравните isin каждого столбца в отдельности, преобразуйте в массив с нулевыми значениями, цепочку поразрядно ИЛИ и в последнем приведении к целым числам:

df['tar_rm'] = (df['animal'].isin(l).values | df['color'].isin(l).values).astype(int)

Производительность : зависит отколичество буксировок, количество совпавших строк и количество значений списка, поэтому лучший тест в реальных данных:

l = ['dog','green','purple']

df = pd.concat([df] * 100000, ignore_index=True).sample(1)
In [173]: %timeit df['tar_rm'] = df[['animal','color']].isin(l).any(axis=1).astype(int)
2.11 ms ± 250 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [174]: %timeit df['tar_rm'] = (df['animal'].isin(l).values | df['color'].isin(l).values).astype(int)
487 µs ± 9.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [175]: %timeit df['tar_rm'] = np.where(df['animal'].isin(l) | df['color'].isin(l), 1, 0)
805 µs ± 15.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...