Pandas фреймы данных ... итерации и списки ... совет нужен - PullRequest
1 голос
/ 17 января 2020

Я новичок в Python и пытаюсь получить совет, пожалуйста.

Я опрашиваю CSV-файл, содержащий около 500 тыс. Строк данных.

Я (вроде) пытаюсь реплицировать логи c формулы xlsx SUMIFS с несколькими критериями для создания нового фрейма данных из моего исходного набора данных с помощью groupby ().

Я думаю, что это хорошо работает для меня (хотя скажите мне, если это глупо), так как я хочу, чтобы мои выходные данные в виде матрицы (это 132 строки х 15 столбцов). Затем я могу умножить его на другие матрицы с такими же размерами и затем экспортировать в Excel.

При таком подходе мне нужно сделать около 100 различных версий ... одна из критериев / переменных в кадре данных относится в «СТРАНУ» ... и у меня есть список из 100 стран, для которых мне нужно провести анализ.

df = pd.read_csv("SourceFile.csv", encoding = 'latin-1')
df = df[((df.Item == cat | (df.Item == dog) | (df.Item == sheep) | (df.Item == chihuahua))
         & (df.Year == 2019)
         & (df.Country == 0) <<< This is the variable I want to repeat 100x
         ].groupby(['ID', 'Customer'])['Amount'].sum().unstack(fill_value = 0)

Прежде чем я начну выяснять, как l oop через мой список кодов стран мои вопросы:

(1) Это разумный способ структурирования анализа? Боюсь, я слишком стараюсь заставить Python вести себя как Excel, а не использовать Python наиболее эффективным из возможных способов

(2) Многое из того, что я прочитал, предполагает, что понимание списка (или векторизация) будет быстрее, чем использование for-l oop ... это уместно в этом случае?

Большое спасибо

1 Ответ

2 голосов
/ 17 января 2020

Я думаю, здесь можно использовать Series.isin вместо кратного |, затем передать Country в groupby и получить последний результат анализа на Country уровне MultiIndex:

np.random.seed(2020)
L = ['cat','dog','sheep','chihuahua','pig','goat']
df = pd.DataFrame({'Item':np.random.choice(L, size=20),
                   'Country':[0] * 10 + [1] * 10,
                   'ID':np.random.choice(['id1','id2','id3'], size=20),
                   'Year':2019,
                   'Amount':np.random.randint(20, size=20),
                   'Customer':np.random.choice(['cust1','cust2','cust3','cust4'], size=20)})
print (df)
         Item  Country   ID  Year  Amount Customer
0         cat        0  id1  2019      14    cust2
1         cat        0  id1  2019       4    cust3
2   chihuahua        0  id1  2019       2    cust4
3   chihuahua        0  id3  2019       3    cust4
4   chihuahua        0  id1  2019       1    cust3
5        goat        0  id2  2019       9    cust1
6   chihuahua        0  id2  2019      19    cust1
7         cat        0  id2  2019      18    cust4
8        goat        0  id3  2019      16    cust3
9         cat        0  id2  2019       1    cust1
10        cat        1  id3  2019      10    cust3
11        cat        1  id2  2019       2    cust3
12      sheep        1  id2  2019       1    cust3
13        dog        1  id3  2019      16    cust1
14  chihuahua        1  id3  2019      18    cust3
15  chihuahua        1  id3  2019       8    cust3
16      sheep        1  id3  2019      14    cust2
17  chihuahua        1  id2  2019       8    cust1
18       goat        1  id1  2019      14    cust4
19        cat        1  id3  2019      11    cust2

df1 = (df[df.Item.isin(['cat','dog','sheep','chihuahua']) & (df.Year == 2019)]
             .groupby(['Country','ID', 'Customer'])['Amount']
             .sum()
             .unstack(fill_value = 0))

print (df1)
Customer     cust1  cust2  cust3  cust4
Country ID                             
0       id1      0     14      5      2
        id2     20      0      0     18
        id3      0      0      0      3
1       id2      8      0      3      0
        id3     16     25     36      0    

print (df1.loc[0])
Customer  cust1  cust2  cust3  cust4
ID                                  
id1           0     14      5      2
id2          20      0      0     18
id3           0      0      0      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...