Использование словаря в качестве справочной информации для фильтрации значений в фрейме данных в pandas - PullRequest
1 голос
/ 10 марта 2020

У меня есть этот фрейм данных.

      drinks  sex
0        1    1
1        1    1
2        1    1
3        1    2
4        1    2
5        1    2
6        1    2
7        2    1
8        2    1
9        2    1
10       1    2
11       1    2
12       3    2
13       3    1
14       3    1
15       2    1
16       2    1
17       2    1

И эти два словаря:

d_1 = {1 :'cola', 2 :'pepsi', 3 : 'fanta'}

d_2 = {1 :'m', 2 : 'f'} 

Я хочу отфильтровать значения в моем фрейме данных, но связав ключи словаря. Например, если я даю:

df[ df['drinks'] == 'cola'] 

then the output should look like this:

drinks  sex

1       1
1       1
1       1
1       2
1       2
1       2
1       2
1       2
1       2 

Идея здесь не в том, чтобы давать значения столбца dataframe, а в том, чтобы давать значения словаря, и он должен фильтровать значения в dataframe. Я пытался написать функцию, но не работал. Есть идеи, как этого добиться. спасибо !!!!

Ответы [ 3 ]

3 голосов
/ 10 марта 2020

Это заменить словарем:

d = dict(zip([*df],[d_1,d_2]))
m = df.replace(d)
output = df[m['drinks']=='cola']
#you can now operate on both columns like : df[(m['drinks']=='cola') & (m['sex']=='m')]

    drinks  sex
0        1    1
1        1    1
2        1    1
3        1    2
4        1    2
5        1    2
6        1    2
10       1    2
11       1    2

Где m:

print(m)

    drinks sex
0    cola   m
1    cola   m
2    cola   m
3    cola   f
4    cola   f
5    cola   f
6    cola   f
7   pepsi   m
8   pepsi   m
9   pepsi   m
10   cola   f
11   cola   f
12  fanta   f
13  fanta   m
14  fanta   m
15  pepsi   m
16  pepsi   m
17  pepsi   m

и словарь выглядит следующим образом:

print(d)
#{'drinks': {1: 'cola', 2: 'pepsi', 3: 'fanta'}, 'sex': {1: 'm', 2: 'f'}}
1 голос
/ 10 марта 2020

Вы можете map со словарем и затем выполнить логическое индексирование как:

df[df.drinks.map(d_1).eq('cola')]

      drinks sex
0        1    1
1        1    1
2        1    1
3        1    2
4        1    2
5        1    2
6        1    2
10       1    2
11       1    2

И то же самое применимо к d_2, вам просто нужно сопоставить его с * вместо d_1

0 голосов
/ 10 марта 2020
import pandas as pd

data = {'drinks': [1,1,1,1,1,1,1,2,2,2,1,1,3,3,3,2,2,2], 'sex': [1,1,1,2,2,2,2,1,1,1,2,2,2,1,1,1,1,1]}

df = pd.DataFrame(data)
#print (df)

d_1 = {1 :'cola', 2 :'pepsi', 3 : 'fanta'}

d_2 = {1 :'m', 2 : 'f'}

# User wants to find key from dictionary by value so i e 'cola' = 1

# Get a list of keys from dictionary which has value that matches with any value in given list of values

def getKeys(dictOfElements, listOfValues):
    listOfKeys = list()
    listOfItems = dictOfElements.items()
    for item  in listOfItems:
        if item[1] in listOfValues:
            listOfKeys.append(item[0])
    return  listOfKeys

k = getKeys(d_1, ['cola'] )
#print (k)

# Basic way to select rows whose column value equals 'cola' == 1

print (df.loc[df['drinks'] == k[0]]) # Get the integer value

# Output:
'''
    drinks  sex
0        1    1
1        1    1
2        1    1
3        1    2
4        1    2
5        1    2
6        1    2
10       1    2
11       1    2
'''

# doing it from list output k with multiple values. Lets try 'cola' == 1 and 'fanta' == 3
k = getKeys(d_1, ['cola', 'fanta'] )
print (df[df.drinks.isin(k)])

# Output:
'''
    drinks  sex
0        1    1
1        1    1
2        1    1
3        1    2
4        1    2
5        1    2
6        1    2
10       1    2
11       1    2
12       3    2
13       3    1
14       3    1
'''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...