Имам следната индексирана 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)
Това е най-простият начин за добавяне на нова колона: df['e'] = e
Извършването на това директно чрез NumPy ще бъде най-ефективно:
df1['e'] = np.random.randn(sLength)
Забележете, че първоначалното ми (много старо) предложение беше да се използва map
(което е много по-бавно):
df1['e'] = df1['a'].map(lambda x: np.random.random())