Python: вложенные циклы не работают во втором цикле

1

Я пытаюсь разделить большой набор данных на более мелкие части для анализа. Я использовал цикл for для разделения набора данных до реализации деревьев решений. Пожалуйста, посмотрите небольшую версию набора данных ниже:

ANZSCO4_CODE          Skill_name              Cluster         date
  1110                  computer                 S              1
  1110                  communication            C              1
  1110                  SAS                      S              2
  1312                  IT support               S              1
  1312                  SAS                      C              2
  1312                  IT support               S              1
  1312                  SAS                      C              1

Первый шаг я создаю пустой словарь:

d = {}

и списки:

 list = [1110, 1322, 2111]
 s_type = ['S','C']

Затем запустите следующий цикл:

for i in list:
    d[i]=pd.DataFrame(df1[df1['ANZSCO4_CODE'].isin([i])] )

Результатом является словарь с 2 наборами данных внутри.

В качестве следующего шага я хотел бы разделить наборы данных на S и C. Я запускаю следующий код:

for i in list:
    d[i]=pd.DataFrame(df1[df1['ANZSCO4_CODE'].isin([i])] )

    for b in s_type:
         d[i]=  d[i][d[i]['SKILL_CLUSTER_TYPE']==b]

В качестве окончательного результата я ожидаю получить 4 отдельных набора данных: 1110 x S, 1110 x C, 1312 x S и 1312 and C

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

  • 1
    не могли бы вы показать мне, что находится в списке переменных?
  • 0
    @ user2906838, прости, что пропустил. Это редактировать сейчас
Теги:
pandas
nested-loops
loops

2 ответа

1
Лучший ответ

Я думаю, что были пустые DataFrames, потому что в данных не были значения из list L (Dont использовать список имен переменных, потому что зарезервированное слово python).

from  itertools import product

L = [1110, 1312, 2111]
s_type = ['S','C']

Затем создайте все комбинации всех списков:

comb = list(product(L, s_type))
print (comb)
[(1110, 'S'), (1110, 'C'), (1312, 'S'), (1312, 'C'), (2111, 'S'), (2111, 'C')]

И последний создайте словарь DataFrame s:

d = {}
for i, j in comb:
    d['{}x{}'.format(i, j)] = df1[(df1['ANZSCO4_CODE'] == i) & (df1['Cluster'] == j)]

Или используйте понимание словаря:

d = {'{}x{}'.format(i, j): df1[(df1['ANZSCO4_CODE'] == i) & (df1['Cluster'] == j)] 
      for i, j in comb}

print (d['1110xS'])
   ANZSCO4_CODE Skill_name Cluster
0          1110   computer       S
2          1110        SAS       S

РЕДАКТИРОВАТЬ:

Если вам нужны все комбинации возможных данных по столбцам, используйте groupby:

d = {'{}x{}x{}'.format(i,j,k): df2 
      for (i,j, k), df2 in df1.groupby(['ANZSCO4_CODE','Cluster','date'])}
print (d)
{'1110xCx1':    ANZSCO4_CODE     Skill_name Cluster  date
1          1110  communication       C     1, '1110xSx1':    ANZSCO4_CODE Skill_name Cluster  date
0          1110   computer       S     1, '1110xSx2':    ANZSCO4_CODE Skill_name Cluster  date
2          1110        SAS       S     2, '1312xCx1':    ANZSCO4_CODE Skill_name Cluster  date
6          1312        SAS       C     1, '1312xCx2':    ANZSCO4_CODE Skill_name Cluster  date
4          1312        SAS       C     2, '1312xSx1':    ANZSCO4_CODE  Skill_name Cluster  date
3          1312  IT support       S     1
5          1312  IT support       S     1}

print (d.keys())
dict_keys(['1110xCx1', '1110xSx1', '1110xSx2', '1312xCx1', '1312xCx2', '1312xSx1'])

Другой подход заключается в том, что в случае необходимости каждая группа использует GroupBy.apply:

def func(x):
    print (x)
    #some code for process each group
    return x

   ANZSCO4_CODE     Skill_name Cluster  date
1          1110  communication       C     1
   ANZSCO4_CODE     Skill_name Cluster  date
1          1110  communication       C     1
   ANZSCO4_CODE Skill_name Cluster  date
0          1110   computer       S     1
   ANZSCO4_CODE Skill_name Cluster  date
2          1110        SAS       S     2
   ANZSCO4_CODE Skill_name Cluster  date
6          1312        SAS       C     1
   ANZSCO4_CODE Skill_name Cluster  date
4          1312        SAS       C     2
   ANZSCO4_CODE  Skill_name Cluster  date
3          1312  IT support       S     1
5          1312  IT support       S     1

df2 = df1.groupby(['ANZSCO4_CODE','Cluster','date']).apply(func)
print (df2)
  • 0
    Привет, я получаю следующую ошибку: TypeError: объект 'list' не вызывается при вызове comb = list (product (L, s_type))
  • 0
    Попытка назвать свой список чем-то отличным от list .
Показать ещё 4 комментария
2

Возможно, что-то вроде этого работает:

from collections import defaultdict

d = defaultdict(pd.DataFrame)

# don't name your list "list"
anzco_list = [1110, 1312]
s_type = ['S','C']

for i in anzco_list:
    for b in s_type:
        d[i][b] = df1[(df1['ANZSCO4_CODE'] == i) & (df1['SKILL_CLUSTER_TYPE'] == b)]

Затем вы можете получить доступ к своим DataFrames следующим образом:

d[1112]['S']
  • 0
    Спасибо за поддержку. Я получаю следующую ошибку: ValueError: Невозможно установить фрейм без определенного индекса и значения, которое нельзя преобразовать в серию.
  • 0
    Вы можете использовать ответ Jezrael ниже. Это кажется лучшим способом сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню