web-dev-qa-db-fra.com

Pandas - Tranche une grande trame de données en morceaux

J'ai une grande trame de données (> lignes 3MM) que j'essaie de passer par une fonction (celle ci-dessous est largement simplifiée), et je continue à obtenir un Memory Error message.

Je pense que je passe une trop grande trame de données dans la fonction, alors j'essaie de:

1) Découpez la trame de données en petits morceaux (de préférence découpé par AcctName)

2) Passez la trame de données dans la fonction

3) Concaténer les trames de données en une seule grande trame de données

def trans_times_2(df):
    df['Double_Transaction'] = df['Transaction'] * 2

large_df 
AcctName   Timestamp    Transaction
ABC        12/1         12.12
ABC        12/2         20.89
ABC        12/3         51.93    
DEF        12/2         13.12
DEF        12/8          9.93
DEF        12/9         92.09
GHI        12/1         14.33
GHI        12/6         21.99
GHI        12/12        98.81

Je sais que ma fonction fonctionne correctement, car elle fonctionnera sur une trame de données plus petite (par exemple 40000 lignes). J'ai essayé ce qui suit, mais je n'ai pas réussi à concaténer les petites trames de données en une seule grande trame de données.

def split_df(df):
    new_df = []
    AcctNames = df.AcctName.unique()
    DataFrameDict = {elem: pd.DataFrame for elem in AcctNames}
    key_list = [k for k in DataFrameDict.keys()]
    new_df = []
    for key in DataFrameDict.keys():
        DataFrameDict[key] = df[:][df.AcctNames == key]
        trans_times_2(DataFrameDict[key])
    rejoined_df = pd.concat(new_df)

Comment j'envisage la séparation des cadres de données:

df1
AcctName   Timestamp    Transaction  Double_Transaction
ABC        12/1         12.12        24.24
ABC        12/2         20.89        41.78
ABC        12/3         51.93        103.86

df2
AcctName   Timestamp    Transaction  Double_Transaction
DEF        12/2         13.12        26.24
DEF        12/8          9.93        19.86
DEF        12/9         92.09        184.18

df3
AcctName   Timestamp    Transaction  Double_Transaction
GHI        12/1         14.33        28.66
GHI        12/6         21.99        43.98
GHI        12/12        98.81        197.62
13
Walt Reed

Vous pouvez utiliser la compréhension de liste pour diviser votre cadre de données en cadres de données plus petits contenus dans une liste.

n = 200000  #chunk row size
list_df = [df[i:i+n] for i in range(0,df.shape[0],n)]

Vous pouvez accéder aux morceaux avec:

list_df[0]
list_df[1]
etc...

Vous pouvez ensuite le réassembler dans une seule trame de données à l'aide de pd.concat.

Par AcctName

list_df = []

for n,g in df.groupby('AcctName'):
    list_df.append(g)
25
Scott Boston