在Pandas DataFrame中创建并设置元素为列表
我有一个Pandas的数据表(DataFrame),我正在一行一行地创建它(我知道,这样做不太符合Pandas的最佳实践)。我用 .loc 来创建元素,像这样:
output.loc[row_id, col_id]
我想把这个值设置为空列表,[]。
output.loc[row_id, col_id] = []
可惜的是,我遇到了一个错误,提示我的键和值的大小不匹配(Pandas认为我是在尝试用一个可迭代对象来设置值,而不是把值设置为一个可迭代对象)。
有没有办法做到这一点呢?
谢谢!
3 个回答
4
MishaTeplitskiy的回答在索引标签为0的时候是有效的。更一般来说,如果你想把一个数组x赋值给一个数据框df中的某个元素,具体是第r行第c列,你可以使用以下方法:
df.loc[[r], c] = pd.Series([x], index = [r])
9
你可以用 pd.at 来代替:
df = pd.DataFrame()
df['B'] = [1, 2, 3]
df['A'] = None
df.at[1, 'A'] = np.array([1, 2, 3])
当你使用 pd.loc
时,pandas 会认为你是在处理一组行。所以如果你试图用 pd.loc
来赋值一个数组,pandas 会尝试把数组中的每个元素和通过 pd.loc
访问到的元素一一对应,这样就会出错了。
8
你需要确保两件事:
- 这个位置(loc)只有一个条目,
- 这一列的数据类型是对象(其实,经过测试,这似乎不是个问题)。
一种比较“hacky”的方法是使用带有 [] 的 Series:
In [11]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
In [12]: df.loc[[0], 'A'] = pd.Series([[]])
In [13]: df
Out[13]:
A B
0 [] 2
1 3 4
pandas 实际上不太希望你使用 []
作为元素,因为这样通常效率不高,而且会让数据聚合变得更复杂(而且不容易优化)。
一般来说,你不想一个单元格一个单元格地构建 DataFrame,几乎总有更好的方法。