pandas concat / merge / join несколько фреймов данных только с одним столбцом по этому столбцу - PullRequest
2 голосов
/ 16 марта 2019

У меня есть (более чем) два фрейма данных:

In [22]: df = pd.DataFrame({'database' : ['db1', 'db2', 'db3']})                                                                                                                                                             

In [23]: df1 = pd.DataFrame({'database' : ['db1', 'db2', 'db3']})                                                                                                                                                            

In [24]: df2 = pd.DataFrame({'database' : ['db2', 'db3', 'db4']})                                                                                                                                                            

In [25]: df1                                                                                                                                                                                                                 
Out[25]: 
  database
0      db1
1      db2
2      db3

In [26]: df2                                                                                                                                                                                                                 
Out[26]: 
  database
0      db2
1      db3
2      db4

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

Out[45]: 
  database database
0      db1         
1      db2      db2
2      db3      db3
3               db4

Мне удалось получить его в таком формате, какэто:

df1.index = df1.database.values.ravel()
df2.index = df2.database.values.ravel()
pd.concat([df1, df2], axis=1).fillna('').reset_index(drop=True)                                                                                                                                                              

Но я думаю, что должно быть лучшее решение, чем этот трюк с функцией ravel ().

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Использование DataFrame.set_index с drop=False:

df = (pd.concat([df1.set_index('database', drop=False), 
                 df2.set_index('database', drop=False)], axis=1)
        .fillna('')
        .reset_index(drop=True))
print (df)
  database database
0      db1         
1      db2      db2
2      db3      db3
3               db4

Более динамичное решение с list comprehension:

dfs = [df, df1, df2]
dfs1 = [x.set_index('database', drop=False) for x in dfs]
df = (pd.concat(dfs1, axis=1)
        .fillna('')
        .reset_index(drop=True))
print (df)
  database database database
0      db1      db1         
1      db2      db2      db2
2      db3      db3      db3
3                        db4
0 голосов
/ 16 марта 2019

Вы можете создать серию и добавить ее в виде строки во фрейм данных, а затем сдвинуть 2-й столбец на 1. Вот пример:

df = pd.concat([df1, df2], axis = 1)
import numpy as np
s = pd.Series([np.NaN, np,NaN], index = ['database', 'database1'])
df.append(s, ignore_index = True)
df['database1'] = df['database1'].shift(1)
df.fillna('')

Это приведет к ожидаемому результату.Надеюсь, это поможет!

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