我有一个Pandas DataFrame,我逐行创建(我知道,我知道,它不是Pandorable / Pythonic ......)。我正在使用 .loc 创建元素,如此
output.loc[row_id, col_id]
并且我想将此值设置为空列表[]。
output.loc[row_id, col_id] = []
不幸的是,我收到一条错误消息,指出我的密钥和值的大小不匹配(Pandas认为我试图将 设置为迭代)。
有办法做到这一点吗?
谢谢!
答案 0 :(得分:6)
你需要确定两件事:
执行此操作的一种黑客方法是使用带[]:
的系列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并不真的希望您使用[]
作为元素,因为它通常不那么有效并且使聚合更复杂(并且不可用于cython)。 < / p>
一般来说,你不想逐个单元地构建DataFrames,(几乎?)总是有更好的方法。
答案 1 :(得分:3)
当索引标签为0时,MishaTeplitskiy的答案有效。更一般地说,如果要将数组x分配给具有行r和列c的DataFrame df的元素,则可以使用:
df.loc[[r], c] = pd.Series([x], index = [r])
答案 2 :(得分:0)
您可以改为使用 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访问的相应元素进行匹配,因此会出现错误。