Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫使用mongodb存储嵌套对象_Python_Mongodb_Pandas - Fatal编程技术网

Python 熊猫使用mongodb存储嵌套对象

Python 熊猫使用mongodb存储嵌套对象,python,mongodb,pandas,Python,Mongodb,Pandas,我想在mongodb中存储一个数据帧。我可以正常地这样做,但我需要添加另一列,其中的值将作为对象存储在mongodb中 Column C: 1. { "test1": "Unknown", "test2": "Unknown" } 2. { "test1": "Unknown", "test2": "Unknown" } 我试图通过以下方式做到这一点: df['C'] = { "test1": "Unknown", "

我想在mongodb中存储一个数据帧。我可以正常地这样做,但我需要添加另一列,其中的值将作为对象存储在mongodb中

Column C:
 1.   {
    "test1": "Unknown",
    "test2": "Unknown"
    }
 2.   {
    "test1": "Unknown",
    "test2": "Unknown"
    }
我试图通过以下方式做到这一点:

df['C'] = {
    "test1": "Unknown",
    "test2": "Unknown"
    }
这给了我一个错误

ValueError: Length of values does not match length of index
稍后我将使用

records = json.loads(df.T.to_json()).values()

db.users.insert(records)

有没有办法做到这一点?

我假设您的数据帧不是一行长,所以您不能为df['C']指定一个值。
您可以制作与数据帧长度相同的列表:

import pandas as pd
df = pd.DataFrame(data=list(range(5)), columns=["Sample"])
df['C'] = [{"test":"value"}]* df.shape[0]
df

    Sample  C
0   0   {'test': 'value'}
1   1   {'test': 'value'}
2   2   {'test': 'value'}
3   3   {'test': 'value'}
4   4   {'test': 'value'}
或使用“应用”运行填充列的函数:

df['C'] = df['Sample'].apply(lambda x: {'test{}'.format(x):'Unknown'})
df

    Sample  C
0   0   {'test0': 'Unknown'}
1   1   {'test1': 'Unknown'}
2   2   {'test2': 'Unknown'}
3   3   {'test3': 'Unknown'}
4   4   {'test4': 'Unknown'}

使用apply的优点是能够轻松地将现有数据从数据帧中删除到新列中。例如,这里的测试编号是从“Sample”字段传入的。

哦,我明白了。那么为什么一个普通的df['C']='Unknown'可以工作呢?这可能会将所有行指定为Unknown,因为字典是可编辑的。分配一个列表也不会工作,例如df['C']=['C']。虽然字符串在技术上是一个iterable,但它与列表或字典不同,它不是一个集合。换句话说,如果您尝试将一组内容分配给pandas列,pandas会尝试对其进行迭代,并将每个值分配给一行。在您的情况下,行数多于值,因此pandas表示没有足够的内容。否问题,很高兴我能帮上忙。这只是我最好的猜测,所以如果你需要更多信息,我建议你检查一下。事实上,我甚至不知道你可以使用df['C']=“somestring”,它会将该字符串分配给列中的每一行。