Python панды - присоединиться с заменой - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь обновить фрейм данных df_1 со значениями, содержащимися в фрейме данных df_2.

df_1      
ID    B    val    val2       
0     1     2      2 
1     1     2      3
1     2     1      1
1     3     1      1
1     4     1      1

df_2      
ID    B    val    val2       
0     1     1      3 
1     1     3      3
1     3     3      3

Результат, который я хочу получить, сообщается ниже в df_3:

df_3      
ID    B    val    val2       
0     1     1      3 
1     1     3      3
1     2     1      1
1     3     3      3
1     4     1      1

Как вы можете соединить столбцы ID и B, и когда есть совпадение в df_2, я подставляю значения. Что касается значений, df_2 содержит точно такие же столбцы df_1.

Есть два вопроса, которые упоминают эту проблему: Панды Python включаются с перезаписью и Панды Python - конкретное слияние / замена . В этих вопросах упоминается та же проблема, что и у меня, однако, когда я пробую решения, о которых сообщается, что объединение занимает много времени, у меня огромный набор данных, и я лично считаю, что упомянутые решения подходят для небольших порций данных. Кроме того, эти вопросы старые, поэтому мне было интересно, есть ли какие-нибудь новости в пандах, которые могут ускорить этот процесс.

1 Ответ

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

Вам необходимо с помощью cumcount создать дополнительные ключи, поскольку идентификатор не уникален, тогда мы делаем concat с drop_duplicates

df1['keys']=df1.groupby('ID').cumcount()
df2['keys']=df2.groupby('ID').cumcount()
pd.concat([df1,df2]).drop_duplicates(['ID','keys'],keep='last').drop('keys',1).sort_index()
Out[31]: 
   ID  B  val  val2
0   0  1    1     3
1   1  1    3     3
2   1  2    1     1

Обновление

df1.set_index(['ID','B'],inplace=True)
df1.update(df2.set_index(['ID','B']))
df1=df1.reset_index()
df1
Out[258]: 
   ID  B  val  val2
0   0  1  1.0   3.0
1   1  1  3.0   3.0
2   1  2  1.0   1.0
3   1  3  3.0   3.0
4   1  4  1.0   1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...