Панды, объединяющиеся на разных по размеру данных в одном столбце - PullRequest
0 голосов
/ 05 октября 2018

У меня есть 2 разных размера данных.

На df1 у меня есть date, time, username, email address, phone number, duration из журналов.Но email address и phone number - это просто столбцы с пустой строкой.

На df2 у меня есть все username, email address и phone number из базы данных.

Какя могу объединить df2 в df1 на основе имени пользователя?То есть размер df1 останется прежним, но столбцы email address и phone number будут заполнены.Конечно, с соответствующими данными из df2

Предполагая, что username уникален

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Используйте merge с левым соединением и параметром suffixes, последним удаляйте исходные столбцы email address и phone number_):

df1 = pd.DataFrame({
        'username':list('abccdd'),
         'email address':[''] * 6,
         'phone number':[''] * 6,
         'duration':[5,3,6,9,2,4],
})
print (df1)
  username email address phone number  duration
0        a                                    5
1        b                                    3
2        c                                    6
3        c                                    9
4        d                                    2
5        d                                    4

df2 = pd.DataFrame({
        'username':list('abcd'),
         'email address':['a@a.sk','b@a.sk','c@a.sk','d@a.sk'],
         'phone number':range(4)
})
print (df2)
  username email address  phone number
0        a        a@a.sk             0
1        b        b@a.sk             1
2        c        c@a.sk             2
3        d        d@a.sk             3

df = (df1.merge(df2, on='username', how='left', suffixes=('_',''))
        .drop(['email address_','phone number_'], axis=1)
        .reindex(columns=df1.columns))
print (df)
  username email address  phone number  duration
0        a        a@a.sk             0         5
1        b        b@a.sk             1         3
2        c        c@a.sk             2         6
3        c        c@a.sk             2         9
4        d        d@a.sk             3         2
5        d        d@a.sk             3         4

Другое решение с difference для всех имен столбцов без определения в списке и reindex для того же порядка, как в df1 столбцов:

c = df1.columns.difference(['email address','phone number'])
df = df1[c].merge(df2, on='username', how='left').reindex(columns=df1.columns)

print (df)
  username email address  phone number  duration
0        a        a@a.sk             0         5
1        b        b@a.sk             1         3
2        c        c@a.sk             2         6
3        c        c@a.sk             2         9
4        d        d@a.sk             3         2
5        d        d@a.sk             3         4
0 голосов
/ 05 октября 2018

Вы можете использовать это:

df = df1[['username', 'date', 'time', 'duration']].merge(df2, left_on='username', right_on='username')

Пример: df1

   date  duration email address phone number   time username
0  2015         5                             14:00       aa
1  2016        10                             16:00       bb

df2

  email address   phone number username
0          rrr@         333444       aa
1           tt@         555533       bb

Выход:

  username  date   time  duration email address   phone number
0       aa  2015  14:00         5          rrr@         333444
1       bb  2016  16:00        10           tt@         555533
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...