Как заполнить список фреймов данных пропущенными значениями

#python #pandas

#python #pandas

Вопрос:

У меня есть фрейм данных со следующим:

 colA  colB
ABC   0.12
GHI   0.01
  

И уникальный список, для которого я хочу создать фрейм данных с:

 ABC
DEF
GHI
  

Фрейм данных, который мне нужно создать, будет иметь:

 colA   colB
ABC    0.12
DEF    0.00
GHI    0.01
  

Каким был бы самый быстрый способ заполнить мой новый фрейм данных (т. Е. Моя интуиция заключалась бы в цикле).

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

1. задавая вопрос в StackOverflow, пожалуйста, помните, что в случае решения вы должны принять лучший ответ, щелкнув галочку рядом с решением. Спасибо!

Ответ №1:

Попробуйте это:

 df.set_index("colA").reindex(["ABC", "DEF", "GHI"], fill_value=0).reset_index()



   colA colB
0   ABC 0.12
1   DEF 0.00
2   GHI 0.01
  

Ответ №2:

Вы могли бы использовать .combine_first , если вы создаете второй фрейм данных из списка и используете .set_index('colA') для обоих фреймов данных:

 df1 = pd.DataFrame({'colA': {0: 'ABC', 1: 'GHI'}, 'colB': {0: 0.12, 1: 0.01}})
lst = ['ABC','DEF','GHI']
df2 = pd.DataFrame({'colA' : lst})
df3 = df1.set_index('colA').combine_first(df2.set_index('colA')).reset_index().fillna(0)
df3
Out[1]: 
  colA  colB
0  ABC  0.12
1  DEF  0.00
2  GHI  0.01
  

Вы могли бы использовать .combine_first , если вы создаете второй фрейм данных из списка и используете .set_index('colA') для обоих фреймов данных:

 df1 = pd.DataFrame({'colA': {0: 'ABC', 1: 'GHI'}, 'colB': {0: 0.12, 1: 0.01}})
lst = ['ABC','DEF','GHI']
df2 = pd.DataFrame({'colA' : lst})
df3 = df1.set_index('colA').combine_first(df2.set_index('colA')).reset_index().fillna(0)
df3
Out[1]: 
  colA  colB
0  ABC  0.12
1  DEF  0.00
2  GHI  0.01
  

Мне было любопытно посмотреть, какой метод был быстрее между combine_first и reindex . Подход Сэмми был быстрее, по крайней мере, для этого фрейма данных.

 df1 = pd.DataFrame({'colA': {0: 'ABC', 1: 'GHI'}, 'colB': {0: 0.12, 1: 0.01}}).set_index('colA')
lst = ['ABC','DEF','GHI']
df2 = pd.DataFrame({'colA' : lst}).set_index('colA')

def f1(): 
    return df1.combine_first(df2).reset_index().fillna(0)


def f2(): 
    return df1.reindex(lst, fill_value=0).reset_index()

%timeit f1()
%timeit f2()

2.35 ms ± 140 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
784 µs ± 25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  

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

1. Спасибо за ваш совет относительно времени.

Ответ №3:

Другой способ — создать список pd.Series, добавить к существующему фрейму данных и удалить дубликаты;

 df.append(pd.DataFrame(l,columns=['colA'])).drop_duplicates(subset=['colA'], keep='first').fillna(0)

 colA  colB
0  ABC  0.12
1  DEF  0.01
2  GHI  0.00