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

Для данного pandas.DataFrame, скажем

df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
df

     A   B
0    5   1
1    6   2
2    3   3
3    4   5

Как мы можем выбрать строки из списка, основываясь на значениях в столбце (например, 'A')

Например

# from
list_of_values = [3,4,6]

# we would like, as a result
#      A   B
# 2    3   3
# 3    4   5
# 1    6   2

Использование isin как упомянуто здесь не является удовлетворительным, поскольку он не поддерживает порядок в списке ввода значений 'A'.

Как можно достичь вышеупомянутой цели?

6
syltruong 21 Авг 2018 в 10:50

3 ответа

Лучший ответ

Один из способов преодоления этого - сделать 'A' столбец index и использовать loc для вновь созданного pandas.DataFrame. В конечном итоге индекс субдискретизированного информационного кадра может быть сброшен.

Вот как:

ret = df.set_index('A').loc[list_of_values].reset_index(inplace=False)

# ret is
#      A   B
# 0    3   3
# 1    4   5
# 2    6   2 

Обратите внимание, что недостатком этого метода является то, что первоначальная индексация была потеряна в процессе.

Подробнее о pandas индексации: Какой смысл индексировать в панды ?

4
syltruong 24 Авг 2018 в 03:48

1] Общий подход к list_of_values.

In [936]: dff = df[df.A.isin(list_of_values)]

In [937]: dff.reindex(dff.A.map({x: i for i, x in enumerate(list_of_values)}).sort_values().index)
Out[937]:
   A  B
2  3  3
3  4  5
1  6  2

2] Если list_of_values отсортирован. Ты можешь использовать

In [926]: df[df.A.isin(list_of_values)].sort_values(by='A')
Out[926]:
   A  B
2  3  3
3  4  5
1  6  2
1
Zero 21 Авг 2018 в 08:04

Используйте merge с помощником DataFrame, созданный списком и с именем столбца соответствующего столбца:

df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5]})

list_of_values = [3,6,4]
df1 = pd.DataFrame({'A':list_of_values}).merge(df)
print (df1)
   A  B
0  3  3
1  6  2
2  4  5

Для более общего решения:

df = pd.DataFrame({'A' : [5,6,5,3,4,4,6,5], 'B':range(8)})
print (df)
   A  B
0  5  0
1  6  1
2  5  2
3  3  3
4  4  4
5  4  5
6  6  6
7  5  7

list_of_values = [6,4,3,7,7,4]

#create df from list 
list_df = pd.DataFrame({'A':list_of_values})
print (list_df)
   A
0  6
1  4
2  3
3  7
4  7
5  4

#column for original index values
df1 = df.reset_index()
#helper column for count duplicates values
df1['g'] = df1.groupby('A').cumcount()
list_df['g'] = list_df.groupby('A').cumcount()

#merge together, create index from column and remove g column
df = list_df.merge(df1).set_index('index').rename_axis(None).drop('g', axis=1)
print (df)
   A  B
1  6  1
4  4  4
3  3  3
5  4  5
3
jezrael 24 Авг 2018 в 06:29
51944021