Pandas DataFrame запрос условного выбора? - PullRequest
0 голосов
/ 24 июня 2018

У меня есть два набора данных я). SanFransisco Зарплатные данные II). Поддельные данные заказа Амазонки

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

1. САН-ФРАНЦИКО ПРИМЕР

import pandas as pd
sal=pd.read_csv('Salary.csv')
sal.info()

DATA

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 148654 entries, 0 to 148653
Data columns (total 13 columns):
Id                  148654 non-null int64
EmployeeName        148654 non-null object
JobTitle            148654 non-null object
BasePay             148045 non-null float64
OvertimePay         148650 non-null float64
OtherPay            148650 non-null float64
Benefits            112491 non-null float64
TotalPay            148654 non-null float64
TotalPayBenefits    148654 non-null float64
Year                148654 non-null int64
Notes               0 non-null float64
Agency              148654 non-null object
Status              0 non-null float64
dtypes: float64(8), int64(2), object(3)
memory usage: 14.7+ MB

Я пытаюсь решить этот вопрос ниже

ВОПРОС: Сколько рабочих мест было представлено только одним человеком в 2013 году? (например, звания вакансий только один раз в 2013 году?)

len(sal[(sal['Year']==2013) & (sal['JobTitle'].value_counts()==1)])

Это не работает. Он выводит 0, где он должен вывести 202

sum(sal[sal['Year']==2013]['JobTitle'].value_counts()==1)

Это работает. Но это не интуитивно понятно.

2. ПРИМЕР ECOMMERCE ИЛИ AMAZON

import pandas as pd
ecom=pd.read_csv('EcommercePurchases.csv')
ecom.info()

DATA

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10000 entries, 0 to 9999
Data columns (total 14 columns):
Address             10000 non-null object
Lot                 10000 non-null object
AM or PM            10000 non-null object
Browser Info        10000 non-null object
Company             10000 non-null object
Credit Card         10000 non-null int64
CC Exp Date         10000 non-null object
CC Security Code    10000 non-null int64
CC Provider         10000 non-null object
Email               10000 non-null object
Job                 10000 non-null object
IP Address          10000 non-null object
Language            10000 non-null object
Purchase Price      10000 non-null float64
dtypes: float64(1), int64(2), object(11)
memory usage: 1.1+ MB

Я попытался решить приведенный ниже вопрос, используя вышеприведенную логику, и в этом случае это сработало

ВОПРОС: Сколько людей выбрали American Express в качестве поставщика кредитной карты и сделали покупку на сумму свыше 95 долларов США?

len(ecom[(ecom['CC Provider']=='American Express') & (ecom['Purchase Price'] >95)])

Это дает идеальный результат здесь. Интересно, почему это не работает в приведенном выше случае.

P.S. Полный новичок здесь, только начал 4-5 дней назад.

1 Ответ

0 голосов
/ 24 июня 2018

Я думаю, нужно GroupBy.transform с size для возврата Серия с таким же размером, как у оригинала DataFrame:

out = ((sal['Year']==2013) & (sal.groupby(['JobTitle','Year'])['JobTitle'].transform('size')==1)).sum()

#count exclude NaN of JobTitle if exist
out = ((sal['Year']==2013) & (sal.groupby(['JobTitle','Year'])['JobTitle'].transform('count')==1)).sum()

Альтернатива с duplicated для исключения всех дубликатов в столбцах, ~ инвертированная логическая маска:

out = ((sal['Year']==2013) & ~(sal.duplicated(subset=['Year','JobTitle'], keep=False))).sum()

Пример :

sal = pd.DataFrame({'JobTitle':list('abccbbd'),
                   'Year':[2012] + [2013] * 6})
print (sal)
  JobTitle  Year
0        a  2012
1        b  2013
2        c  2013
3        c  2013
4        b  2013
5        b  2013
6        d  2013

print (sal.groupby(['JobTitle','Year'])['JobTitle'].transform('size'))
0    1
1    3
2    2
3    2
4    3
5    3
6    1
Name: JobTitle, dtype: int64

out = ((sal['Year']==2013) & (sal.groupby(['JobTitle','Year'])['JobTitle'].transform('size')==1)).sum()

print (out)
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...