J'ai une base de données de 0,7 Go de MongoDB contenant des tweets que j'essaie de charger dans un Dataframe. Cependant, je reçois une erreur.
cursor = tweets.find() #Where tweets is my collection tweet_fields = ['id'] result = DataFrame(list(cursor), columns = tweet_fields)
4 Réponses :
J'ai modifié mon code dans les éléments suivants: en ajoutant le paramètre champs em> dans la fonction Rechercher () J'ai limité la sortie. Ce qui signifie que je ne charge pas tous les champs mais que seuls les champs sélectionnés dans le Dataframe. Tout fonctionne bien maintenant. P> P>
la voie la plus rapide et la plus efficace de la plupart de la mémoire, de créer un Dataframe à partir d'une requête de MongoDB, comme dans votre cas, utiliserait monary . P>
Cet article a une explication agréable et concise. P>
J'ai vu cela poussé sur Stackoverflow plusieurs fois maintenant, mais cela a presque toujours été mal utilisé. Si vous vérifiez l'API, il semble être clair que les seuls types de données autorisés sont numériques pas texte i>. Dans ce cas, je suppose (en raison de l'inclusion du terme "tweet") que c'est pas i> le cas d'utilisation approprié du monary.
Un moyen élégant de faire serait le suivant:
import pandas as pd def my_transform_logic(x): if x : do_something return result def process(cursor): df = pd.DataFrame(list(cursor)) df['result_col'] = df['col_to_be_processed'].apply(lambda value: my_transform_logic(value)) #making list off dictionaries db.collection_name.insert_many(final_df.to_dict('records')) # or update db.collection_name.update_many(final_df.to_dict('records'),upsert=True) #make a list of cursors.. you can read the parallel_scan api of pymongo cursors = mongo_collection.parallel_scan(6) for cursor in cursors: process(cursor)
the de_records Code>
ClassMethod code> est probablement le meilleur moyen de le faire:
from pandas import pd
import pymongo
client = pymongo.MongoClient()
data = db.mydb.mycollection.find() # or db.mydb.mycollection.aggregate(pipeline)
df = pd.DataFrame.from_records(data)