Verwenden Sie dies als schnellen Ausgangspunkt;

http://pandas.pydata.org/pandas-docs/stable/reshaping.html

In [1]: df
Out[1]: 
         date variable     value
0  2000-01-03        A  0.469112
1  2000-01-04        A -0.282863
2  2000-01-05        A -1.509059
3  2000-01-03        B -1.135632
4  2000-01-04        B  1.212112
5  2000-01-05        B -0.173215
6  2000-01-03        C  0.119209
7  2000-01-04        C -1.044236
8  2000-01-05        C -0.861849
9  2000-01-03        D -2.104569
10 2000-01-04        D -0.494929
11 2000-01-05        D  1.071804

Wenn Sie dann 'A' isolieren, erhalten Sie Folgendes:

In [2]: df[df['variable'] == 'A']
Out[2]: 
        date variable     value
0 2000-01-03        A  0.469112
1 2000-01-04        A -0.282863
2 2000-01-05        A -1.509059

Das Erstellen eines neuen Datenrahmens wäre nun:

dfA = df[df['variable'] == 'A'] 

Nehmen wir an, B wäre:

dfB = df[df['variable'] == 'B'] 

Isolieren der Datenrahmen in dfA, dfB, dfC ......

dfList  = list(set(df['variable']))
dfNames = ["df" + row for row in dfList]  

for i, row in enumerate(dfList):
    dfName = dfNames[i]
    dfNew = df[df['variable'] == row]
    dfNames[i] = dfNew      

Es läuft ... Aber wenn ich dfA versuche, bekomme ich die Ausgabe "dfA" is not defined

1
Merlin 10 Aug. 2015 im 22:12

3 Antworten

Beste Antwort

Um Ihre Frage wörtlich zu beantworten, würde globals()['dfA'] = dfNew dfA definieren im globalen Namespace:

for i, row in enumerate(dfList):
    dfName = dfNames[i]
    dfNew = df[df['variable'] == row]
    globals()[dfName] = dfNew   

Es gibt jedoch nie einen guten Grund, dynamisch benannte Variablen zu definieren.

  • Wenn die Namen erst zur Laufzeit bekannt sind, dh wenn die Namen wirklich sind dynamisch - dann können Sie die Namen in Ihrem Code nicht verwenden, da Ihr Code hat vor der Laufzeit geschrieben werden. Was bringt es also, eine Variable mit dem Namen zu erstellen? dfA, wenn Sie in Ihrem Code nicht darauf verweisen können?

  • Wenn Sie andererseits vorher wissen, dass Sie eine Variable haben werden mit dem Namen dfA, dann ist Ihr Code nicht wirklich dynamisch. Sie haben statische Variablennamen. Der einzige Grund, die Schleife zu verwenden, besteht darin, den Code der Kesselplatte zu reduzieren. Jedoch, Auch in diesem Fall gibt es eine bessere Alternative. Die Lösung besteht darin, ein Diktat (siehe unten) oder eine Liste 1 zu verwenden.

  • Das Hinzufügen von dynamisch benannten Variablen verschmutzt den globalen Namespace.

  • Es verallgemeinert nicht gut. Wenn Sie 100 dynamisch benannte Variablen hatten, wie Würden Sie darauf zugreifen? Wie würden Sie sie durchlaufen?

  • Um dynamisch benannte Variablen zu "verwalten", müssten Sie eine Liste ihrer Variablen führen Namen als Zeichenfolgen: z.B. ['dfA', 'dfB', 'dfC',...] und dann auf die neu zugegriffen geprägte globale Variablen über das globals() -Diktat: z. globals()['dfA']. Das ist umständlich.

Die Schlussfolgerung, zu der Programmierer durch bittere Erfahrung gelangen, lautet: Dynamisch benannte Variablen liegen irgendwo zwischen umständlich und nutzlos und das ist es auch viel angenehmer, leistungsfähiger, praktischer, um Schlüssel / Wert-Paare in einem Diktat zu speichern. Das Der Name der Variablen wird zu einem Schlüssel im Diktat und der Wert der Variablen wird der dem Schlüssel zugeordnete Wert. Also, anstatt einen bloßen Namen zu haben dfA Sie hätten ein Diktat dfs und würden über auf den dfA DataFrame zugreifen dfs['dfA']:

dfs = dict()
for i, row in enumerate(dfList):
    dfName = dfNames[i]
    dfNew = df[df['variable'] == row]
    dfs[dfName] = dfNew   

Oder, wie Jianxun Li zeigt,

dfs = {k: g for k, g in df.groupby('variable')}

Aus diesem Grund haben Jon Clements und Jianxun Li Ihre Frage beantwortet, indem sie Alternativen zur Definition dynamisch benannter Variablen aufgezeigt haben. Es ist, weil wir alle glauben, dass es eine schreckliche Idee ist.


Verwenden der Lösung von Jianxun Li zum Durchlaufen von Schlüssel / Wert-Paaren eines Dikts Sie könnten dann verwenden:

dfs = {k: g for k, g in df.groupby('variable')}
for key, df in dfs.items():
    ...

Oder verwenden Sie die Lösung von Jon Clements, um durch Gruppen zu iterieren Sie könnten verwenden:

grouped = df.groupby('variable')
for key, df in grouped:
    ...

1

3
Community 23 Mai 2017 im 12:16

Verwenden Sie groupby und get_group, z.

grouped = df.groupby('variable')

Wenn Sie dann mit jeder Gruppe etwas unternehmen möchten, greifen Sie als solches darauf zu:

my_group = grouped.get_group('A')

Gibt Ihnen:

    date    variable    value
0   2000-01-03  A   0.469112
1   2000-01-04  A   -0.282863
2   2000-01-05  A   -1.509059
5
Jon Clements 10 Aug. 2015 im 19:20

df.groupby('variable') gibt einen Iterator mit key/df Paaren zurück. Um eine Liste / ein Diktat der Untergruppen zu erhalten,

result = {k: g for k, g in df.groupby('variable')}

from pprint import pprint
pprint(result)

{'A':          date variable   value
0  2000-01-03        A  0.4691
1  2000-01-04        A -0.2829
2  2000-01-05        A -1.5091,
 'B':          date variable   value
3  2000-01-03        B -1.1356
4  2000-01-04        B  1.2121
5  2000-01-05        B -0.1732,
 'C':          date variable   value
6  2000-01-03        C  0.1192
7  2000-01-04        C -1.0442
8  2000-01-05        C -0.8618,
 'D':           date variable   value
9   2000-01-03        D -2.1046
10  2000-01-04        D -0.4949
11  2000-01-05        D  1.0718}


result['A']

         date variable   value
0  2000-01-03        A  0.4691
1  2000-01-04        A -0.2829
2  2000-01-05        A -1.5091
1
Jianxun Li 10 Aug. 2015 im 20:44