J'ai travaillé sur un projet et je suis coincé dans une situation où je dois créer plusieurs cadres de données à partir d'une liste de chaînes en filtrant sur les valeurs de la liste de chaînes d'un autre cadre de données ayant une colonne contenant les mêmes valeurs dans la liste. J'écris le code comme ci-dessous:

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))

Cela a généré une erreur indiquant «index de tuple hors plage». Quelqu'un pourrait-il s'il vous plaît aider rapidement à ce sujet?

0
Arindam Bose 23 mai 2018 à 13:24

3 réponses

Meilleure réponse

Vous pouvez convertir groupby objecter à tuple s puis à dict s:

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
jezrael 23 mai 2018 à 11:25

Je suggère d'utiliser dict car il rend le travail plus sûr que exec:

uniqueC = df.C.unique()

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

Maintenant, lorsque vous avez besoin d'une certaine trame de données, appelez simplement:

dfs['df_A']
#   A         B  C
#0  1  1.755507  A
#1  2 -0.371027  A
0
zipa 23 mai 2018 à 10:31

Utilisez un dictionnaire pour un nombre variable de variables. Vous pouvez utiliser groupby dans une compréhension de dictionnaire:

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

print(dfs['B'])

   A         B  C
2  3 -0.785257  B

Je vous conseille de ne pas :

  1. Nommer les variables après les intégrées, par exemple n'utilisez pas list comme nom de variable.
  2. Utilisez exec en raison de lacunes de sécurité.
  3. Oubliez de mettre en retrait les boucles for. L'indentation est importante en Python.
0
jpp 23 mai 2018 à 10:36