Создание новых фреймов данных в цикле в Python - PullRequest
0 голосов
/ 23 мая 2018

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

df = pd.DataFrame({'A': range(1, 5), 'B': np.random.randn(4), 'C':['A',A','B','C']}
list = df.C.unique()
list = list.tolist()
for r in list:
exec('df_{}=df[df.C=={}]'.format(r))

Это выдает ошибку, говорящую «индекс кортежа вне диапазона».Может ли кто-нибудь, пожалуйста, быстро помочь в этом?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Используйте словарь для переменного числа переменных.Вы можете использовать groupby в словаре:

dfs = {k: v for k, v in df.groupby('C')}

print(dfs['B'])

   A         B  C
2  3 -0.785257  B

Я советую вам сделать , а не :

  1. Переменные имен после встроенных, например, сделатьне используйте list в качестве имени переменной.
  2. Используйте exec из-за недостатков безопасности.
  3. Забудьте сделать отступ для любых циклов for.Отступы важны в Python.
0 голосов
/ 23 мая 2018

Вы можете преобразовать groupby объект в tuple с и затем в dict с:

d = dict(tuple(df.groupby('C')))

d = dict(tuple(df.groupby('C')))
print (d['A'])
   A         B  C
0  1  0.670449  A
1  2 -1.265135  A

print (d['B'])
   A        B  C
2  3 -0.35891  B

print (d['C'])
   A         B  C
3  4  0.651704  C
0 голосов
/ 23 мая 2018

Я предлагаю использовать dict, поскольку это делает работу более безопасной, чем exec:

uniqueC = df.C.unique()

dfs = {'df_{}'.format(r): df[df.C==r] for r in uniqueC}

Теперь, когда вам нужен определенный фрейм данных, просто позвоните:

dfs['df_A']
#   A         B  C
#0  1  1.755507  A
#1  2 -0.371027  A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...