在Pandas DataFrame中创建并设置元素为列表

10 投票
3 回答
13704 浏览
提问于 2025-04-20 17:46

我有一个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

你需要确保两件事:

  1. 这个位置(loc)只有一个条目,
  2. 这一列的数据类型是对象(其实,经过测试,这似乎不是个问题)。

一种比较“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,几乎总有更好的方法。

撰写回答