#python #pandas #list #indexing #union
#python #pandas #Список #индексирование #объединение
Вопрос:
У меня есть список значений, и я хочу гарантировать, что все значения существуют в индексе фрейма данных.
Я достиг этого, используя следующее, но хочу знать, могу ли я сделать это более простым способом? Я пробовал различные ~ ... .isin
конструкции, но не смог получить то, что хочу, спасибо
#df1 is my data frame
df1=pd.DataFrame({'i':[1, 3, 5, 7],
'a':[2, 4, 6, 8]})
df1.set_index(['i'], inplace=True)
df1
# l is the list containing index values
# i make this a data frame with an index but no columns so i can use merge
l=[3, 4, 5]
df=pd.DataFrame(l)
df.set_index([0], inplace=True)
df.index.names=['i']
df
Используйте слияние для добавления любых отсутствующих значений индекса
df1.merge(df, how='outer', on='i', sort=True)
Ответ №1:
Используйте reindex
вместе с pd.Index.union
(при условии, что у вас нет повторяющихся значений для индекса фрейма данных или дубликатов в l
)
import pandas as pd
df1 = pd.DataFrame({'i':[1, 3, 5, 7], 'a':[2, 4, 6, 8]}).set_index('i')
l = [3, 4, 5]
df1 = df1.reindex(df1.index.union(l))
# a
#i
#1 2.0
#3 4.0
#4 NaN
#5 6.0
#7 8.0
Комментарии:
1. Спасибо, что нашли время @ALollz — panda cub здесь
2. Нет проблем! Все может немного усложниться, если вам нужно иметь дело с дубликатами, потому что тогда вам нужно решить, хотите ли вы, чтобы эти строки мультипликативно росли, но если вы уверены, что в конце концов вам нужен не дублирующийся индекс, это будет хорошо работать.
3. я не знал, что
index.union()
может принимать список, я предположил, что его нужно сначала преобразоватьpd.Index(l)
. Это полезно знать.4. @rhug123 да, многие методы pandas довольно гибкие, поскольку они принимают большинство входных данных, похожих на массивы, в этом случае он будет принимать
list
,set
,np.array
,pd.Series
,tuple
, и несколько других, я уверен, что я не учитываю