Use the original df1 indexes to create the series:
(使用原始的df1索引创建系列:)
df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
Edit 2015
(编辑2015)
Some reported getting the SettingWithCopyWarning
with this code.
(一些报告说使用此代码获取SettingWithCopyWarning
。)
However, the code still runs perfectly with the current pandas version 0.16.1.
(但是,该代码仍可以在当前的熊猫0.10.1版本中完美运行。)
>>> sLength = len(df1['a'])
>>> df1
a b c d
6 -0.269221 -0.026476 0.997517 1.294385
8 0.917438 0.847941 0.034235 -0.448948
>>> df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
a b c d e
6 -0.269221 -0.026476 0.997517 1.294385 1.757167
8 0.917438 0.847941 0.034235 -0.448948 2.228131
>>> p.version.short_version
'0.16.1'
The SettingWithCopyWarning
aims to inform of a possibly invalid assignment on a copy of the Dataframe.
(SettingWithCopyWarning
目的是通知有关数据框副本的可能无效分配。)
It doesn't necessarily say you did it wrong (it can trigger false positives) but from 0.13.0 it let you know there are more adequate methods for the same purpose. (它不一定表示您做错了(它可能会触发误报),但是从0.13.0开始,它使您知道有更多适当的方法可以实现相同的目的。)
Then, if you get the warning, just follow its advise: Try using .loc[row_index,col_indexer] = value instead (然后,如果收到警告,请遵循其建议: 尝试使用.loc [row_index,col_indexer] = value代替)
>>> df1.loc[:,'f'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
a b c d e f
6 -0.269221 -0.026476 0.997517 1.294385 1.757167 -0.050927
8 0.917438 0.847941 0.034235 -0.448948 2.228131 0.006109
>>>
In fact, this is currently the more efficient method as described in pandas docs
(实际上,这是熊猫文档中描述的当前更有效的方法)
Edit 2017
(编辑2017)
As indicated in the comments and by @Alexander, currently the best method to add the values of a Series as a new column of a DataFrame could be using assign
:
(如评论中所述,@ Alexander指出,当前将Series的值添加为DataFrame的新列的最佳方法是使用assign
:)
df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…