Python. Объединить несортированные массивы (неполные) - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть три массива:

ID, Name, F1,
1, John, 21
5, Peter, 29
4, Don, 50

ID, F2
1, 40
5, 22

Name, F3
Don, 30
Peter, 66

И я хочу объединить их в один массив:

ID, Name, F1, F2, F3
1, John, 21, 40, NaN
5, Peter, 29, 22, 66
4, Don, 50, NaN, 50

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

Код:

A = np.array([[1, "John", 21], [5, "Peter", 29],[4, "Don", 50]])
B = np.array([[1, 40],[5, 22]])
C = np.array([["Don", 30],["Peter", 66]])

создание словаря:

ID = A[:,0]
Name = A[:,1]
zipbObj = zip(ID, Name)
dictIDName = dict(zipbObj)

Но теперь я не знаю, как просматривать массивы B , C в общем виде.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2020

Использование pandas.merge_ordered:

pd.merge_ordered(pd.merge_ordered(df1, df2), df3)

За пример

df1 = pd.DataFrame({'ID': [1,5,4],
                    'Name': ['John', 'Peter', 'Don'],
                    'F1': [21, 29, 50]})
df2 = pd.DataFrame({'ID': [1,5],
                    'F2': [40, 22]})
df3 = pd.DataFrame({'Name': ['Don', 'Peter'],
                    'F3': [30,66]})

print(pd.merge_ordered(pd.merge_ordered(df1, df2), df3))

Результат:

   ID   Name  F1    F2    F3
0   4    Don  50   NaN  30.0
1   1   John  21  40.0   NaN
2   5  Peter  29  22.0  66.0
0 голосов
/ 17 апреля 2020

Я подготовил небольшую функцию, которая может сделать это:

#ID,Name,F1
arr1=[[1,'Jhon',21],[5,'Peter',29],[4,'Don',29]]
#ID,F2
arr2=[[1,40],[5,22]]
#Name,F3    
arr3=[['Don',30],['Peter',66]]

def merge_arrs(a1,a2,a3):
    res=[]
    dim=len(arr1)
    for i in range(0,dim):
        res.append([a1[i][0],a1[i][1],a1[i][2],None,None])

    for i in range(0,len(a2)):
        idx=-1
        for j in range(0,dim):
            try:
                a1[j].index(a2[i][0])
                idx=j
                break
            except ValueError as ve:
                continue
            if(idx>=0):
                res[idx][3]=a2[i][1]

    for i in range(0,len(a3)):
        idx=-1
        for j in range(0,dim):
            try:
                a1[j].index(a3[i][0])
                idx=j
                break
            except ValueError as ve:
                continue
            if(idx>=0):
                res[idx][4]=a2[i][1]


    return res

print(merge_arrs(arr1,arr2,arr3))

результат: [[1, 'Jhon', 21, 40, None], [5, 'Peter', 29, 22, 22], [4, 'Don', 29, None, 40]]

Надеюсь, это поможет. Удачи!

0 голосов
/ 17 апреля 2020

Наборы могут использоваться для выполнения математических операций над множествами, таких как объединение, пересечение, разность и симметрия c разница. Может быть, этот урок будет полезен https://www.programiz.com/python-programming/set

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