Python для возврата определенного столбца, используя понимание списка или apply () - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь преобразовать код R в код Python и застрял на этом этапе.Можете ли вы сказать мне, как лучше всего реализовать этот фрагмент кода в Python?

only0_0$count =0
for(i in 2:length(only0_0$ID))
{
    only0_0$count[i]=ifelse((only0_0$year[i]-1) %in% 
    clientData$Year[clientData$CUSTOMERID %in% only0_0$ID[i]],1,0)
}

Фон:

  1. И clientData, и only0_0 являются фреймами данных.
  2. Данные клиента {столбцы: год, CustomerID, ...}
  3. only0_0 {столбцы: год, ID}
  4. ID и CustomerID оба представляют собой одно и то же и не являются уникальными в соответствующей таблице.
  5. Сортировать только 0_0 по {'ID', 'year'}

Псевдокод:

  1. В only0_0 при создании нового столбца 'count' будут все нули.
  2. для цикла, начинающегося со второго наблюдения до последнего, заполните переменную count как:

    • выберите все «CustomerID» из clientData, где «ID» только в 0_0 соответствует дляконкретная строка.
    • например, only0_0.ID == 3197
    • clientData.CustomerID вернет идентификаторы всех строк с customerID = 3197
    • например, вывод последнего шага: rowid (или indexв Python) {3,11, 81, 87}
    • извлекать соответствующие значения года из идентификаторов строк, возвращенных из последнихшаг
    • например, вывод последнего шага: {2006, 2008, 2009, 2006}

    • скажем: вывод (only0_0.year - 1) == 2008

    • с 2008 г. по {2006, 2008, 2009, 2006}, количество = 1

Дайте мне знать, если это ясно сейчас,

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Спасибо, я получил ответ.

    if ((only0_0.year[i] - 1) in (clientData['Year'][clientData['CUSTOMERID_transformed'] == only0_0.loc[i, 'ID0_0']].values)):
        only0_0.loc[i,"count"]=1
    else:
        only0_0.loc[i,"count"]=0
1 голос
/ 29 мая 2019

Не зная, что конкретно представляют собой only0_0 и clientData, это довольно сложно, но вот некоторые фрагменты, которые должны вам помочь:

Я полагаю, only0_0 - это pandas.DataFrame и clientData словарь, потому что он не содержит единообразных данных.

Так, например,

import pandas as pd
clientData = {'Year': [..., ...], 'CUSTOMERID_transformed': ....}
only0_0 = pd. DataFrame({'count': [1, 2, 3, ...], 'year': [2010, 2012, 2019, ...]})
only0_0.loc[i, 'count'] = 0
for i in range(1, only0_0.shape[0]):    # i.e. skipping the first row
   only0_0.loc[i, 'count'] = 0 if ... else 1

или

... = int(1-bool(...))

но я думаю, что это более питоническийнапишите

if ...:
    only0_0.loc[i, 'count'] = 0
else:
    only0_0.loc[i, 'count'] = 1

Теперь для условия, я думаю, что оно состоит из

(only0_0.loc[i, 'year'] - i) in clientData['Year'][...]

и

clientData['CUSTOMERID_transformed'] in only0_0.loc[i, 'ID0_0']

РЕДАКТИРОВАТЬ: Вашпримечание предполагает скорее

only0_0.loc[i, 'ID0_0'] in clientData['CUSTOMERID_transformed'] 

Надеюсь, это поможет вам начать.

...