将标量值分配给空的DataFrame似乎没有任何作用

DBl*_*ess 4 python dataframe pandas

我是熊猫新手,有一个非常基本的问题!

在通过spyder的Python v3.6上:

x= pd.DataFrame(columns = ['1','2'])
print(x)
x['1'] = '25'
print(x)
Run Code Online (Sandbox Code Playgroud)

从打印语句来看,数据框x似乎没有变化。我的问题:做x['1'] = '25'什么,如果有的话?

cs9*_*s95 7

实际上,分配标量和可迭代对象的语义之间存在区别(请考虑诸如列表之类的列表之类的容器)。

考虑,

df = pd.DataFrame(columns=['1', '2'])                                                                                             
df                                                                                                                                  

Empty DataFrame
Columns: [1, 2]
Index: []
Run Code Online (Sandbox Code Playgroud)

您已经定义了一个空的数据框,没有任何索引(没有行),但是只有列的架构。

将标量分配给列时,该分配将在所有行中广播。在这种情况下,由于没有任何内容,因此不会发生任何事情:

df['1'] = 123
df

Empty DataFrame
Columns: [1, 2]
Index: []
Run Code Online (Sandbox Code Playgroud)

但是,分配类似列表的可迭代对象是另一回事,因为熊猫会为其创建新行:

df['1'] = [123]
df

     1    2
0  123  NaN
Run Code Online (Sandbox Code Playgroud)

现在,要了解标量分配的工作原理,请考虑类似的空DataFrame,但具有已定义的索引:

df = pd.DataFrame(columns=['1', '2'], index=[0, 1])
df                                                                                                                                  

     1    2
0  NaN  NaN
1  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

它仍然是“空的”(不是真的),但是现在我们可以分配标量,并且分配是广播的,

df['1'] = 123
df                                                                                                                                  

     1    2
0  123  NaN
1  123  NaN
Run Code Online (Sandbox Code Playgroud)

将此行为与先前显示的进行对比。

  • 熊猫在分配可迭代对象时必须进行某种类型检查,因为像字符串这样的可迭代对象所遵循的行为与列表/数组的行为不同(我使用“ ististance(x,collections.Iterable)”来定义可迭代对象)。 (2认同)
  • @ user3483203感谢您提到这一点,我进行了编辑以使其清楚,我在谈论的是类似列表的可迭代对象:) (2认同)