2017-02-20 1 views
2

У меня есть два DataFrames и вы хотите использовать второй только для строк, индекс которых уже не содержится в первом.Конкат двух DataFrames по отсутствующим индексам

Каков наиболее эффективный способ сделать это?

Пример:

df_1 
idx  val 
0  0.32 
1  0.54 
4  0.26 
5  0.76 
7  0.23 

df_2 
idx  val 
1  10.24 
2  10.90 
3  10.66 
4  10.25 
6  10.13 
7  10.52 

df_final 
idx  val 
0  0.32 
1  0.54 
2  10.90 
3  10.66 
4  0.26 
5  0.76 
6  10.13 
7  0.23 

Резюме: мне нужно добавить строки в df_2, для которых индекс уже не в df_1.


EDIT

Удалены некоторые показатели в df_2, чтобы проиллюстрировать тот факт, что все индексы из df_1 не охвачены в df_2.

ответ

1

Вы можете достичь разыскиваемого вывода, используя combine_first метод DataFrame. Из документации по методу:

Соедините два объекта DataFrame и по умолчанию с ненулевыми значениями в кадре, вызывающем метод. Индекс Результата столбцы будут объединением соответствующих индексов и столбцов использования

Примера:

import pandas as pd 

df_1 = pd.DataFrame([0.32,0.54,0.26,0.76,0.23], columns=['val'], index=[0,1,4,5,7]) 
df_1.index.name = 'idx' 

df_2 = pd.DataFrame([10.56,10.24,10.90,10.66,10.25,10.13,10.52], columns=['val'], index=[0,1,2,3,4,6,7]) 
df_2.index.name = 'idx' 

df_final = df_1.combine_first(df_2) 

Это даст желаемый результат:

In [7]: df_final 
Out[7]: 
     val 
idx  
0  0.32 
1  0.54 
2 10.90 
3 10.66 
4  0.26 
5  0.76 
6 10.13 
7  0.23 
3

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

df = df_1.reindex(df_2.index).combine_first(df_2) 
print (df) 
     val 
idx  
0  0.32 
1  0.54 
2 10.90 
3 10.66 
4  0.26 
5  0.76 
6 10.13 
7  0.23 

df = df_1.reindex(df_2.index).fillna(df_2) 
print (df) 
     val 
idx  
0  0.32 
1  0.54 
2 10.90 
3 10.66 
4  0.26 
5  0.76 
6 10.13 
7  0.23 
+0

Я не сделать это очевидным в мой пример, но индекс 'df_2' не охватывает весь индекс' df_1'. Следовательно, этот метод не работает так, как он есть, он принимает только индексы, которые появляются в 'df_2'. – Jivan

+0

Я пытаюсь проверить его, для меня это работает. Можете ли вы добавить его к образцам, где проблема в моем решении? Благодарю. – jezrael

+0

У меня есть len (df) = len (df_2) 'при запуске любого из ваших решений. Индексы, которые находятся в 'df_1', но не в' df_2', удаляются. – Jivan

Смежные вопросы