2015-07-13 4 views
0

Рассмотрите наличие блока данных с столбцами «A», «B» и «C».python pandas index dataframe с использованием dict

Я хотел бы выбрать строки из dataframe, используя форму формы {'A': 1, 'B': 2}. Это должно дать мне все строки, где A = 1 и B = 2.

Также диктовка меняется динамически, поэтому я не знаю заранее, какие столбцы нужно запрашивать. Это может быть {'A': 1, 'C': 2} на другой итерации.

+0

вы можете загрузить свои данные? –

ответ

0

Вы можете использовать функцию .groupby.filter().

import pandas as pd 
import numpy as np 

# your data 
# ============================= 
np.random.seed() 
A = np.random.randint(1, 5, 100) 
B = np.random.randint(1, 5, 100) 
C = np.random.randint(1, 5, 100) 
df = pd.DataFrame(dict(A=A,B=B,C=C)) 
print(df) 

    A B C 
0 3 4 4 
1 2 2 4 
2 2 2 4 
3 3 1 1 
4 2 4 2 
5 3 3 2 
6 1 1 3 
7 3 3 3 
8 4 4 4 
9 2 4 3 
.. .. .. .. 
90 3 1 3 
91 3 2 3 
92 1 1 1 
93 1 2 3 
94 3 2 2 
95 2 4 1 
96 4 2 3 
97 4 2 4 
98 1 2 3 
99 1 4 3 

[100 rows x 3 columns] 


# processing 
# ===================== 
my_dict = {'A':1, 'B':2} 

df.groupby(level=0).filter(lambda row: (row.A == my_dict['A']) & (row.B == my_dict['B'])) 

    A B C 
41 1 2 1 
43 1 2 2 
53 1 2 4 
67 1 2 1 
93 1 2 3 
98 1 2 3 
+0

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

0

Я встретил нечто подобное. Это мое решение:

import pandas as pd 

df = pd.DataFrame(
    dict(A=(1, 2, 3, 4), B=(5, 6, 7, 8), C=(9, 10, 11, 12), 
     D=(1, 2, 3, 4))) 

search = dict(A=2, B=6) 
search_string = ','.join(map(str, search.values())) 
df['merged'] = df.apply(
    lambda x: ','.join(map(str, [getattr(x, col) for col in search])), 
    axis=1) 
df = df[df['merged'] == search_string].drop('merged', axis=1).set_index(
    [k for k in search]) 

print(df) 

Здесь search ДИКТ может быть все, что вы хотите

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