Применить функцию с двумя полями данных - PullRequest
3 голосов
/ 25 февраля 2020

У меня есть такой фрейм данных (для создания примера фрейма данных);

df = pd.DataFrame({'language': ['ruby','ruby','ruby', np.nan,'ruby'],
                   'top_lang_owned': [['ruby', 'javascript', 'go'], 
                                      ['ruby', 'coffeescript'],
                                      ['javascript', 'coffeescript'],
                                      ['ruby', 'shell', 'go'],
                                      np.nan],
                   'top_lang_watched': [['ruby','go'], 
                                      ['javascript'],
                                      np.NaN,
                                      ['ruby', 'shell'],
                                      np.nan]})
df
  language    top_lang_owned          top_lang_watched
0 ruby     [ruby, javascript, go]     [ruby, go]
1 ruby     [ruby, coffeescript]       [javascript]
2 ruby     [javascript, coffeescript]  NaN
3 NaN      [ruby, shell, go]          [ruby, shell]
4 ruby      NaN                        NaN
dataframe.info();
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 2 columns):
language          4 non-null object
top_lang_owned    4 non-null object
dtypes: object(2)
memory usage: 208.0+ bytes

Я хочу добавить поле, сравнивающее значения двух полей. (псевдокод)

if ("language" is in "top_lang_owned") 
then new_field = 1 othervise new_field = 0.

Например, желаемый вывод должен быть ниже;

language  top_lang_owned           top_lang_watched  is_owned is_watched
0 ruby    [ruby, javascript, go]      [ruby, go]       1       1
1 ruby    [ruby, coffeescript]        [javascript]     1       0
2 ruby    [javascript, coffeescript]   NaN             0       0
3 NaN     [ruby, shell, go]           [ruby, shell]    NaN     NaN
4 ruby     NaN                         NaN             NaN     NaN

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Вы, безусловно, можете сделать это, вот код, который вы можете попробовать,

РЕДАКТИРОВАТЬ:

def func(x):
    if x.language in x.top_lang_owned:
        return 1
    return 0

df['is_in_lang'] = df[~df.isna().any(1)].apply(func, axis=1)

ВЫХОД:

    id language                    top_lang_owned  is_in_lang
0   21     ruby            [ruby, javascript, go]           1
1   25     ruby  [javascript, ruby, coffeescript]           1
2   38     ruby        [javascript, coffeescript]           0
3  108      NaN                 [ruby, shell, go]           NaN
4  173     ruby                               NaN           NaN
0 голосов
/ 25 февраля 2020

Вы можете отфильтровать NA и применить условие:

df['is_in_lang'] = df[~df.isna().any(1)].apply(lambda x: 1 if x['language'] in x['top_lang_owned'] else 0, 1)

  language                    top_lang_owned  is_in_lang
0     ruby            [ruby, javascript, go]         1.0
1     ruby  [javascript, ruby, coffeescript]         1.0
2     ruby        [javascript, coffeescript]         0.0
3      NaN                 [ruby, shell, go]         NaN
4     ruby                               NaN         NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...