Замените столбцы фрейма данных pandas другим фреймом данных на основе определенного столбца

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть два фрейма данных со многими столбцами df1, df2, и я хочу заменить все значения df1 (кроме столбцов времени) данными из столбцов df2, где значения времени одинаковы:

 df1:

index time   x y   ......many other columns ( the same as df2)
0       1    1 1
1       1.1  2 2
2       1.1  3 3
3       1.1  4 4
4       1.4  5 5
5       1.5  6 6
6       1.5  7 7


df2:

index time  x   y   ....many other columns (the same as df1)
0       1   10  10
1       1.1 11  11
2       1.2 12  12
3       1.3 13  13
4       1.4 14  14
5       1.5 15  15
6       1.6 16  16



the result for df1 should be:

index time  x   y   ....many other columns 
0       1    10 10
1       1.1  11 11
2       1.1  11 11
3       1.1  11 11
4       1.4  14 14
5       1.5  15 15
6       1.5  15 15


 

Комментарии:

1. Вы могли бы просто объединить два фрейма данных и удалить первые столбцы фрейма данных.

Ответ №1:

Я думаю, что мне удалось привести в порядок свои мысли и, надеюсь, найти решение, которое будет работать для вас.

Попробуйте это, вы можете получить свой ответ с помощью using combine_first и выполнить некоторые настройки:

  1. combine_first заполняет нулевые значения из другого dataframe , поэтому сначала вы можете заменить все значения (кроме столбца ‘time’) на np.nan . Обратите внимание, что я использую столбец ‘time’ в качестве index .
  2. As combine_first вернет объединение двух фреймов данных, которое вы можете использовать isin для получения только значений времени из df1 вашего конечного вывода.
 import numpy as np
import pandas as pd

df1[df1.columns.difference(['time'])] = np.nan
res = df1.set_index('time').combine_first(df2.set_index('time')).reset_index()
li = [i for i in df1['time'].unique()]

final= res[res['time'].isin(li)]
 

Что даст вам:

    time     x     y
0   1.0  10.0  10.0
1   1.1  11.0  11.0
2   1.1  11.0  11.0
3   1.1  11.0  11.0
6   1.4  14.0  14.0
7   1.5  15.0  15.0
8   1.5  15.0  15.0
 

Попробуйте это на вашем фактическом наборе данных и дайте мне знать, если это сработает.

Ответ №2:

Вам необходимо объединить:

 df1 = df1.merge(df2, left_index = True, right_index = True)
 

затем вам нужно удалить ненужные столбцы

Комментарии:

1. разве это не вызвало бы ошибку? когда мы выполняем df1[‘time’], мы получим серию, а затем вызовем «merge», который является атрибутом фрейма данных

2. проблема с merge заключается в том, что он создает эти дополнительные столбцы с суффиксами _x, _y

3. Не проблема. Помогает различать происхождение похожих имен столбцов

4. К сожалению, это проблема для меня:( , эти суффиксы создадут проблемы в других частях программы

Ответ №3:

Редактировать: неправильно истолковал вопрос в первый раз. Это должно помочь:

 df1[['time']].merge(df2, on='time')
 

Комментарии:

1. Не сработает, он удалит повторяющиеся значения времени из df1 (1.1, 1.1, 1.1), а также добавит значения, которых нет в df1 (например, он добавит время 1.6, которого нет в df1)

2. @Tenshi Вы понимаете код, который я опубликовал? Кажется, что вы не можете.

3. вы можете попробовать свой код с входными данными, которые я опубликовал в вопросе, вы увидите, что это не даст желаемого результата