创建Pandas DataFrame的元素并将其设置为列表

DrM*_*sha 5 python dataframe pandas

我有一个Pandas DataFrame,我正在逐行创建(我知道,我知道,它不是Pandorable/Pythonic ......).我使用创建元素的.loc像这样

output.loc[row_id, col_id]
Run Code Online (Sandbox Code Playgroud)

我想将此值设置为空列表[].

output.loc[row_id, col_id] = []
Run Code Online (Sandbox Code Playgroud)

不幸的是,我得到一个错误,说我的钥匙和值不匹配的大小(熊猫认为我试图设定值的迭代).

有没有办法做到这一点?

谢谢!

小智 9

您可以使用pd.at代替:

df = pd.DataFrame()
df['B'] = [1, 2, 3]
df['A'] = None
df.at[1, 'A'] = np.array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

当您使用 时pd.loc,pandas 认为您正在与一组行进行交互。因此,如果您尝试使用 分配数组pd.loc,pandas 会尝试将数组的每个元素与由 访问的相应元素进行匹配pd.loc,因此会出现错误。


And*_*den 6

你需要确定两件事:

  1. 那个地方只有一个条目,
  2. 该列有dtype对象(实际上,在测试时这似乎不是问题).

一个hacky方法是使用带[]的系列:

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
Run Code Online (Sandbox Code Playgroud)

大熊猫并不真的希望你[]用作元素,因为它通常不那么有效,并且使聚合更复杂(并且不可用于cythonisable).


一般来说,你不想逐个单元地构建DataFrame,有(几乎?)总是更好的方法.

  • 因此,对一个系列而不是单个条目/值进行分配,这就是"技巧"/黑客! (2认同)