Добавяне на нова колона към съществуваща DataFrame в Python pandas

Имам следната индексирана DataFrame с именувани колони и редове, които не са непрекъснати числа:

          a         b         c         d
2  0.671399  0.101208 -0.181532  0.241273
3  0.446172 -0.243316  0.051767  1.577318
5  0.614758  0.075793 -0.451460 -0.012493

Бих искал да добавя нова колона, 'e', към съществуващата рамка от данни и не искам да променям нищо в рамката от данни (т.е. новата колона винаги има същата дължина като рамката от данни).

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64

Опитах различни версии на join, append, merge, но не получих желания резултат, а най-много само грешки. Как мога да добавя колона e към горния пример?

Решение

Използвайте оригиналните индекси df1, за да създадете сериите:

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)

Редактиране 2015 Някои съобщават за получаване на предупреждението SettingWithCopyWarning с този код.
Въпреки това кодът продължава да работи перфектно с текущата версия на pandas 0.16.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'

Предупреждението SettingWithCopyWarning има за цел да информира за евентуално невалидно присвояване върху копие на Dataframe. Не е задължително да казва, че сте го направили погрешно (може да предизвика фалшиви положителни резултати), но от версия 0.13.0 ви уведомява, че има по-адекватни методи за същата цел. След това, ако получите предупреждението, просто следвайте съветите му: Вместо това опитайте да използвате .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
>>> 

Всъщност това понастоящем е по-ефикасният метод, както е описано в документите на pandas


Редактиране 2017

Както е посочено в коментарите и от @Alexander, понастоящем най-добрият метод за добавяне на стойностите на серия като нова колона на DataFrame може да бъде използването на assign:

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)
Коментари (27)

Това е най-простият начин за добавяне на нова колона: df['e'] = e

Коментари (4)

Извършването на това директно чрез NumPy ще бъде най-ефективно:

df1['e'] = np.random.randn(sLength)

Забележете, че първоначалното ми (много старо) предложение беше да се използва map (което е много по-бавно):

df1['e'] = df1['a'].map(lambda x: np.random.random())
Коментари (2)