Новый столбец, основанный на сопоставлении значений из других панд данных - PullRequest
2 голосов
/ 13 марта 2019

Если у нас есть два кадра данных, таких как df1 и df2 в примере, показанном ниже;как мы объединяем их, чтобы сгенерировать df3?

import pandas as pd
import numpy as np

data1 = [("a1",["A","B"]),("a2",["A","B","C"]),("a3",["B","C"])]
df1 = pd.DataFrame(data1,columns = ["column1","column2"])
print df1

data2 = [("A",["1","2"]),("B",["1","3","4"]),("C",["5"])]
df2 = pd.DataFrame(data2,columns=["column3","column4"])
print df2

data3 = [("a1",["A","B"],["1","2","3","4"]),("a2",["A","B","C"], 
["1","2","3","4","5"]),("a3",["B","C"],["1","3","4","5"])]
df3 = pd.DataFrame(data3,columns = ["column1","column2","column5"])
print df3

Я стремлюсь не использовать циклы, так как имею дело с большими наборами данных

Ответы [ 3 ]

7 голосов
/ 13 марта 2019

Проверьте с помощью stack столбцов списка df1 после пересоздания с помощью DataFrame, затем map значения из df2


Также, поскольку вы просите не использовать цикл, я использую sum, а sum для этого случая намного медленнее, чем *for loop* или itertools


s=pd.DataFrame(df1.column2.tolist()).stack()
df1['New']=s.map(df2.set_index('column3').column4).sum(level=0).apply(set)
df1
Out[36]: 
  column1    column2              New
0      a1     [A, B]     {2, 4, 3, 1}
1      a2  [A, B, C]  {3, 5, 4, 2, 1}
2      a3     [B, C]     {4, 3, 1, 5}

Как я уже упоминал, и большинство из нас предположили, вы также можете проверить с помощью Для петель с пандами - Когда мне следует позаботиться?

import itertools
d=dict(zip(df2.column3,df2.column4))


l=[set(itertools.chain(*[d[y] for y in x ])) for x in df1.column2.tolist()]
df1['New']=l
2 голосов
/ 13 марта 2019

Вы можете сделать это, как показано ниже:

df2_dict = {i:j for i,j in zip(df2['column3'].values, df2['column4'].values)}
# print(df2_dict)

def func(val):
    return sorted(list(set(np.concatenate([df2_dict.get(i) for i in val]))))

df1['column5'] = df1['column2'].apply(func)
print(df1)

Вывод:

  column1    column2          column5
0      a1     [A, B]     [1, 2, 3, 4]
1      a2  [A, B, C]  [1, 2, 3, 4, 5]
2      a3     [B, C]     [1, 3, 4, 5]
0 голосов
/ 13 марта 2019

Это работает:

df1['column2'].apply(lambda x: list(set((np.concatenate([df2.set_index('column3')['column4'][i] for i in list(x)])) )))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...