Использование векторизации в Pandas, когда в каждой строке необходимо использовать все данные для сравнения - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть контактные данные ниже.

    mobile      email           contact_code index_clone contact_day
0   0972135314  abc@gmail.com   1            0           9/26/2018
1   0972135314  cde@gmail.com   2            1           9/26/2018
2   0943360092  cmt@gmail.com   3            2           9/25/2018
3   0988870766  def@gmail.com   4            3           9/24/2018
4   0972135314  cmt@gmail.com   5            4           9/27/2018

Мне нужно создать новый столбец с именем "пользователь".Пользовательский столбец получает данные из кода контакта, если контакты имеют один и тот же мобильный телефон или один и тот же адрес электронной почты, они являются одним и тем же пользователем, и значение пользователя для этих контактов является наименьшим contact_code.

Например: строка 4: номер мобильного телефона - 0972135314, поэтому он соответствует строке 0 и 1, адрес электронной почты - cmt@gmail.com, поэтому он соответствует строке 2. Код контакта для всех 3 соответствующих строк равен {1,2,3}, поэтому пользовательский столбец строки 4 равен 1, наименьшее значение.

Проблема в том, что мне нужно циклически проходить по каждой строке, чтобы найти совпадающие строки, получить список contact_code и назначить наименьшее значение для пользовательского столбца,Так что Панды бегут медленно.Как я могу сделать процесс быстрее?Вот мой код.

for idx in data.index:
    data.set_value(idx,"user",min(data.loc[(data["index_clone"] <= idx) & ((data["mobile"] == data.get_value(idx,"mobile")) | (data["email"] == data.get_value(idx,"email"))),"contact_code"]))

* Обновление: спасибо wm и jpp за ваши ответы.Но у меня есть другая проблема.В каждой строке есть столбец contact_day, это день контакта.Например, есть 3 контакта строки пользователя 1 (строки 0, 1 и 4).Contact_day для строки 0 и день контакта для строки 1 - 26.09.2008, а для contact_day для строки 4 - 27.09.2008.Таким образом, в столбце «поворот» строки 0 и 1 - 1, а в строке «поворот» 4 - 2. Как получить поворот контакта пользователя, не просматривая все строки?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы можете отдельно получить минимальный код контакта для каждой группы мобильных телефонов, а затем для каждой группы электронных писем:

min_mobile_cc = df.groupby("mobile").contact_code.transform(np.min)
min_email_cc = df.groupby("email").contact_code.transform(np.min)

Для каждой строки в данных сохраняется либо их исходный код контакта, либо минимальный контакт.код любой из других строк в той же группе мобильных устройств / адресов электронной почты.

В ходе этой подготовки вы можете выбрать глобальный минимальный код контакта между группами мобильных устройств и адресов электронной почты:

df["user"] = np.minimum(min_mobile_cc, min_email_cc)
0 голосов
/ 26 сентября 2018

Один из способов - отсортировать ваш фрейм данных по убыванию contact_code и создать пару отображений словаря.Затем используйте эти сопоставления для получения правильных contact_code.

. Это работает, потому что во время построения словаря значения для ключей перезаписываются последующими присваиваниями.Вы заинтересованы только в отображениях минимум , которые применяются при нашей первоначальной сортировке.

df_rev = df.sort_values('contact_code', ascending=False)
d1 = df_rev.set_index('mobile')['contact_code'].to_dict()
d2 = df_rev.set_index('email')['contact_code'].to_dict()

df['contact_code_new'] = np.minimum(df['mobile'].map(d1), df['email'].map(d2))

print(df)

      mobile          email  contact_code  index_clone  contact_code_new
0  972135314  abc@gmail.com             1            0                 1
1  972135314  cde@gmail.com             2            1                 1
2  943360092  cmt@gmail.com             3            2                 3
3  988870766  def@gmail.com             4            3                 4
4  972135314  cmt@gmail.com             5            4                 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...