Совпадение строк по значению идентификатора в пандах Python - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно сопоставить контакты в базе данных по тому, как с ними связался уникальный идентификационный номер.Я создал очень маленький фиктивный фрейм данных ниже, чтобы помочь с предложением:

data = [
    ["email", "emailperson1@email.com", 1],
    ["phone", "555-555-1111", 1],
    ["slack", "secondpersonslack", 2],
    ["phone", "111-111-1111", 3],
]

data2 = [
    [1, "emailperson1@email.com", "555-555-1111", "slack1"],
    [2, "emailperson2@gmail.com", "555-555-2222", "secondpersonslack"],
    [3, "tomasconticello@gmail.com", "111-111-1111", "tomasslack"],
]

stackdata = pd.DataFrame(
    data, columns=["contact method", "from:", "column that I dont know how to make"]
)
stackdata2 = pd.DataFrame(data2, columns=["id", "email", "phone", "slack"])

В моем реальном наборе данных я хочу заполнить столбец «столбец, который я не знаю, как сделать».

Итак, возьмите первый метод контакта в stackdata в первой строке, который был адресом электронной почты.Это электронное письмо совпадает с идентификатором 1 в stack2, поэтому оно будет заполнять столбец в stackdata1 значением «1».

Я думал о каком-то цикле for вроде:

for i in stackdata['column that I dont know how to make']:
  if i matches one of the columns in any row, then populate column with id of that row

Спасибо за любую помощь и дайте мне знать, если я смогу облегчить ответ на этот вопрос!

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Попробуйте это:

for i in range(len(stackdata)):
    stackdata['contact_id'][i] = str(stackdata2[(stackdata2['email'] == stackdata['from:'][i]) | (stackdata2['phone'] == stackdata['from:'][i]) | (stackdata2['slack'] == stackdata['from:'][i])]['id'].values).strip('[]')

'contact_id' это столбец 'column that I dont know how to make'

1 голос
/ 19 июня 2019

Один из способов - melt столбцы метода контакта во втором DataFrame в один столбец и merge результат с первым DataFrame.По умолчанию панды объединяются в любом столбце с одинаковыми именами слева и справа.( Из документов : «Если on не передано, а left_index и right_index имеют значение False, то пересечение столбцов в DataFrames и / или Series будет выведено как ключи объединения.»)

# Choose desired columns from your example data
df = stackdata[['contact method', 'from:']].copy()  

# Melt or "unpivot" the contact methods, renaming
# the resulting variable and value columns to match
# column names in stackdata
melted = pd.melt(stackdata2, 
                 id_vars='id', 
                 value_vars=['email', 'phone', 'slack'], 
                 value_name='from:', var_name='contact method')

# Merge with default arguments
pd.merge(df, melted)
  contact method                   from:  id
0          email  emailperson1@email.com   1
1          phone            555-555-1111   1
2          slack       secondpersonslack   2
3          phone            111-111-1111   3
...