python - how - pymongo_id
Inserta un Dataframe Pandas en mongodb usando PyMongo (5)
¿Cuál es la forma más rápida de insertar un DataFrame pandas en mongodb usando PyMongo
?
Intenta
db.myCollection.insert(df.to_dict())
dio un error InvalidDocument: documents must have only string keys, key was Timestamp(''2013-11-23 13:31:00'', tz=None)
db.myCollection.insert(df.to_json())
dio un error TypeError: ''str'' object does not support item assignment
db.myCollection.insert({id: df.to_json()})
dio un error InvalidDocument: documents must have only string keys, key was <built-in function id>
df
<class ''pandas.core.frame.DataFrame''>
DatetimeIndex: 150 entries, 2013-11-23 13:31:26 to 2013-11-23 13:24:07
Data columns (total 3 columns):
amount 150 non-null values
price 150 non-null values
tid 150 non-null values
dtypes: float64(2), int64(1)
Qué tal esto:
db.myCollection.insert({id: df.to_json()})
id será una cadena única para ese df
Aquí tienes la manera más rápida. Usando el método insert_many
de pymongo 3 y el parámetro ''records'' del método to_dict
.
db.insert_many(df.to_dict(''records''))
Odo puede hacerlo usando
odo(df, db.myCollection)
Si su dataframe tiene datos faltantes (es decir, None, nan) y no quiere valores clave nulos en sus documentos:
db.insert_many(df.to_dict("records"))
insertará claves con valores nulos. Si no desea los valores de clave vacíos en sus documentos, puede usar una versión modificada del .to_dict("records")
pandas .to_dict("records")
continuación:
from pandas.core.common import _maybe_box_datetimelike
my_list = [dict((k, _maybe_box_datetimelike(v)) for k, v in zip(df.columns, row) if v != None and v == v) for row in df.values]
db.insert_many(my_list)
donde if v != None and v == v
He agregado cheques para asegurarme de que el valor no sea None
o nan
antes de ponerlo en el diccionario de la fila. Ahora su .insert_many
solo incluirá claves con valores en los documentos (y ningún tipo de datos null
).
Dudo que haya un método más rápido y simple . Si no te preocupa la conversión de datos, puedes hacer
>>> import json
>>> df = pd.DataFrame.from_dict({''A'': {1: datetime.datetime.now()}})
>>> df
A
1 2013-11-23 21:14:34.118531
>>> records = json.loads(df.T.to_json()).values()
>>> db.myCollection.insert(records)
Pero en caso de que intentes cargar datos , obtendrás:
>>> df = read_mongo(db, ''myCollection'')
>>> df
A
0 1385241274118531000
>>> df.dtypes
A int64
dtype: object
por lo tanto, deberá convertir las columnas ''A'' a datetime
s, así como todos los campos no int
, float
o str
en su DataFrame
. Para este ejemplo:
>>> df[''A''] = pd.to_datetime(df[''A''])
>>> df
A
0 2013-11-23 21:14:34.118531