Обновите фрейм данных на основе индекса и добавьте новые - PullRequest
0 голосов
/ 22 октября 2018

Df1:

Id    val
1     4
3     7
9     2
4     5

Df2:

Id    val
1     5
7     2

Обязательно:

Id    val
1     5
3     7
9     2
4     5
7     2

У меня есть эти df1 и df2, и я хочу получить требуемый dfгде общие идентификаторы, присутствующие в Df1 и Df2, будут обновлены, а новые идентификаторы будут добавлены.

Кажется, я не вижу, нужно ли мне использовать update, merge или join или что-то еще.

Ответы [ 4 ]

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

Вы можете выровнять индексы, update, затем concat.Решение является многословным, но поддерживает порядок строк в соответствии с желаемым результатом.

df1 = df1.set_index('Id')
df2 = df2.set_index('Id')

df1.update(df2)

df = pd.concat([df1, df2[~df2.index.isin(df1.index)]])\
       .reset_index().astype(int)

print(df)

   Id  val
0   1    5
1   3    7
2   9    2
3   4    5
4   7    2
0 голосов
/ 22 октября 2018

Использование combine_first

df2.set_index('Id').combine_first(df1.set_index('Id')).reset_index()
Out[6]: 
   Id  val
0   1  5.0
1   3  7.0
2   4  5.0
3   7  2.0
4   9  2.0
0 голосов
/ 22 октября 2018

dictionary распаковка

m1 = dict(zip(df1.Id, df1.val))
m2 = dict(zip(df2.Id, df2.val))

pd.DataFrame([*{**m1, **m2}.items()], columns=['Id', 'val'])

   Id  val
0   1    5
1   3    7
2   4    5
3   7    2
4   9    2

Альтернативная форма
cols = ['Id', 'val']
m1 = dict(zip(*map(df1.get, cols)))
m2 = dict(zip(*map(df2.get, cols)))

pd.DataFrame([*{**m1, **m2}.items()], columns=cols)

get

m1 = dict(zip(df1.Id, df1.val))
m2 = dict(zip(df2.Id, df2.val))
f = lambda x: m2.get(x, m1.get(x, x))

pd.DataFrame([[x, f(x)] for x in {*df1.Id, *df2.Id}], columns=['Id', 'val'])

   Id  val
0   1    5
1   3    7
2   4    5
3   7    2
4   9    2
0 голосов
/ 22 октября 2018

Используйте concat с drop_duplicates (обратите внимание, порядок может не сохраняться).

pd.concat([df1, df2]).drop_duplicates('Id', keep='last')

   Id  val
1   3    7
2   9    2
3   4    5
0   1    5
1   7    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...