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

时间:2014-09-09 18:32:05

标签: python pandas dataframe

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

output.loc[row_id, col_id]

并且我想将此值设置为空列表[]。

output.loc[row_id, col_id] = []

不幸的是,我收到一条错误消息,指出我的密钥和值的大小不匹配(Pandas认为我试图将 设置为迭代)。

有办法做到这一点吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

你需要确定两件事:

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

  3. 执行此操作的一种黑客方法是使用带[]:

    的系列
    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访问的相应元素进行匹配,因此会出现错误。