熊猫怪癖使用集合作为数据类型

时间:2017-03-31 05:31:28

标签: python pandas set

我正在尝试使用set data type列扩充现有数据框。我正在迭代数据帧的行并添加到每个集合,但是更新正在应用于每一行,即

>>> df = pd.DataFrame()
>>> df['foo'] = [set()] * 2                                                                                                                          
>>> df
  foo
0  {}
1  {}

>>> df.ix[0, 'foo'].update([1, 2, 3])    
>>> df
         foo
0  {1, 2, 3}
1  {1, 2, 3}

有谁知道为什么会发生这种情况和/或使用集合的替代机制?

2 个答案:

答案 0 :(得分:0)

我认为您可以使用loc

df = pd.DataFrame()
df['foo'] = [set()] * 2   
df.loc[0, 'foo'] = set([1, 2, 3])
print (df)
         foo
0  {1, 2, 3}
1         {}

此外,它适用于ix,但在下一版pandas中已弃用:

df.ix[0, 'foo'] = set([1, 2, 3])
print (df)
         foo
0  {1, 2, 3}
1         {}

警告 :pandas并不真正支持非标量条目,因此您将面临意外错误的风险。尽管如此,有时它仍然有用,但实际上我过去曾被一些人咬过。

答案 1 :(得分:0)

发生这种情况的原因是因为您在两个索引处使用了相同的set实例副本:

df['foo'] = [set()] * 2

因此,当您尝试更新时,会在两个集中添加值。

而是创建一个不同的实例:

df['foo'] = [set() for _ in range(2)]