Dodawanie nowej kolumny do istniejącego DataFrame w Pythonie

Mam następujący indeksowany DataFrame z nazwanymi kolumnami i wierszami nie-ciągłymi liczbami:

          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

Chciałbym dodać nową kolumnę 'e' do istniejącej ramki danych i nie chcę niczego zmieniać w ramce danych (tzn. nowa kolumna zawsze ma taką samą długość jak ramka danych).

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64
Próbowałem różnych wersji join, append, merge, ale nie dostałem pożądanego rezultatu, tylko co najwyżej błędy. Jak Mogę dodać kolumnę e do powyższego przykładu?
Author: Brad Solomon, 2012-09-23

21 answers

Użyj oryginalnych indeksów df1, aby utworzyć serię:

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


Edit 2015
Niektórzy zgłosili się, aby uzyskać SettingWithCopyWarning z tym kodem.
Jednak kod nadal działa idealnie z aktualną wersją pandy 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'] = p.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 ma na celu poinformowanie o ewentualnym nieprawidłowym przypisaniu na kopii ramki danych. Nie koniecznie mówi, że zrobiłeś to źle (może wywołać fałszywe alarmy), ale od 0.13.0 daje Ci znać, że są bardziej odpowiednie metody dla ten sam cel. Następnie, jeśli otrzymasz ostrzeżenie, po prostu postępuj zgodnie z jego radą: spróbuj użyć .loc[row_index, col_indexer] = wartość zamiast

>>> df1.loc[:,'f'] = p.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
>>> 
W rzeczywistości, jest to obecnie bardziej efektywna metoda, jak opisane w pandy docs

Edit 2017

Jak wskazano w komentarzach i przez @ Alexander, obecnie najlepszą metodą dodawania wartości serii jako nowej kolumny ramki danych może być użycie assign:

df1 = df1.assign(e=p.Series(np.random.randn(sLength)).values)
 702
Author: joaquin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-07 12:07:59

Jest to prosty sposób na dodanie nowej kolumny: df['e'] = e

 151
Author: Kathirmani Sukumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-10 06:53:58

Chciałbym dodać nową kolumnę, 'e', do istniejącej ramki danych i nie zmieniać niczego w ramce danych. (Seria zawsze miała taką samą długość jak ramka danych.)

Zakładam, że wartości indeksu w e odpowiadają wartościom w df1.

Najprostszy sposób zainicjowania nowej kolumny o nazwie e i przypisania jej wartości z serii e:

df['e'] = e.values

Assign (Pandy 0.16.0+)

Od Pandas 0.16.0, można również użyć assign, która przypisuje nowe kolumny do ramki danych i zwraca nowy obiekt (kopię) ze wszystkimi oryginalnymi kolumnami oprócz nowych.

df1 = df1.assign(e=e.values)

Zgodnie z ten przykład (który zawiera również kod źródłowy funkcji assign), Możesz również dołączyć więcej niż jedną kolumnę:

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df.assign(mean_a=df.a.mean(), mean_b=df.b.mean())
   a  b  mean_a  mean_b
0  1  3     1.5     3.5
1  2  4     1.5     3.5

W kontekście twojego przykładu:

np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
mask = df1.applymap(lambda x: x <-0.7)
df1 = df1[-mask.any(axis=1)]
sLength = len(df1['a'])
e = pd.Series(np.random.randn(sLength))

>>> df1
          a         b         c         d
0  1.764052  0.400157  0.978738  2.240893
2 -0.103219  0.410599  0.144044  1.454274
3  0.761038  0.121675  0.443863  0.333674
7  1.532779  1.469359  0.154947  0.378163
9  1.230291  1.202380 -0.387327 -0.302303

>>> e
0   -1.048553
1   -1.420018
2   -1.706270
3    1.950775
4   -0.509652
dtype: float64

df1 = df1.assign(e=e.values)

>>> df1
          a         b         c         d         e
0  1.764052  0.400157  0.978738  2.240893 -1.048553
2 -0.103219  0.410599  0.144044  1.454274 -1.420018
3  0.761038  0.121675  0.443863  0.333674 -1.706270
7  1.532779  1.469359  0.154947  0.378163  1.950775
9  1.230291  1.202380 -0.387327 -0.302303 -0.509652

Opis tej nowej funkcji, gdy została po raz pierwszy wprowadzona, można znaleźć tutaj .

 97
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:32

Robienie tego bezpośrednio przez NumPy będzie najbardziej efektywne:

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

Uwaga moja oryginalna (bardzo stara) sugestia polegała na użyciu map (co jest znacznie wolniejsze):

df1['e'] = df1['a'].map(lambda x: np.random.random())
 35
Author: Andy Hayden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 13:05:01

Wydaje się, że w ostatnich wersjach pand sposobem na przejście jest użycie df.przypisanie :

df1 = df1.assign(e=np.random.randn(sLength))

Nie produkuje SettingWithCopyWarning.

 29
Author: Mikhail Korobov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 07:39:25

Super proste przypisanie kolumny

Ramka danych pandy jest zaimplementowana jako uporządkowany dict kolumn.

Oznacza to, że __getitem__ [] może być używany nie tylko do uzyskania określonej kolumny, ale __setitem__ [] = Może być użyty do przypisania nowej kolumny.

Na przykład, ta ramka danych może mieć kolumnę dodaną do niej, po prostu używając [] accessor
    size      name color
0    big      rose   red
1  small    violet  blue
2  small     tulip   red
3  small  harebell  blue

df['protected'] = ['no', 'no', 'no', 'yes']

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Zauważ, że to działa nawet jeśli indeks ramki danych jest wyłączony.

df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

[]= is the way to go, ale uważaj!

Jeśli jednak masz pd.Series i spróbujesz przypisać go do ramki danych, w której indeksy są wyłączone, będziesz miał kłopoty. Zobacz przykład:

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Dzieje się tak dlatego, że pd.Series domyślnie ma indeks wyliczany od 0 do N. i metoda pandas [] = próbuje być "mądrym"

Co właściwie się dzieje.

Podczas korzystania z metody [] = pandy Po cichu wykonuje zewnętrzne połączenie lub zewnętrzne połączenie używając indeksu lewej ramka danych ręki i indeks serii prawej ręki. df['column'] = series

Side note

To szybko powoduje dysonans poznawczy, ponieważ metoda []= próbuje zrobić wiele różnych rzeczy w zależności od wejścia, A wyniku nie można przewidzieć, chyba że po prostu wiesz {56]} Jak działają pandy. Ja bym więc odradzał []= w bazach kodu, ale podczas eksploracji danych w notatniku jest dobrze.

Obejście problemu

Jeśli masz pd.Series i chcesz, aby był przypisany od góry do dołu, lub jeśli kodujesz kod produktywny i nie jesteś pewien kolejności indeksów, warto zabezpieczyć się przed tego rodzaju problemem.

Możesz obniżyć pd.Series do np.ndarray lub list, to wystarczy.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values

Lub

df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))

Nie jest to jednak zbyt jednoznaczne.

Jakiś programista może przyjść i powiedzieć "Hej, to wygląda na zbędne, po prostu zoptymalizuję to".

Explicit sposób

Ustawienie indeksu pd.Series jako indeksu {[28] } jest jednoznaczne.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)

Lub bardziej realistycznie, prawdopodobnie masz pd.Series już dostępne.

protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index

3     no
2     no
1     no
0    yes

Można teraz przypisać

df['protected'] = protected_series

    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

Alternatywny sposób z df.reset_index()

Ponieważ dysonans indeksu jest problemem, jeśli uważasz, że indeks ramki danych powinien nie dyktować rzeczy, możesz po prostu upuścić Indeks, to powinno być szybciej, ale nie jest zbyt czyste, ponieważ twoja funkcja teraz prawdopodobnie robi dwie rzeczy.

df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Uwaga na df.assign

Chociaż df.assign wyjaśnij to, co robisz, w rzeczywistości ma wszystkie te same problemy, co powyżej []= {41]}

df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Po prostu uważaj z {[31] } że Twoja kolumna nie nazywa się self. Spowoduje to błędy. To sprawia, że df.assign śmierdzący , ponieważ są tego rodzaju artefakty w funkcji.

df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'

Możesz powiedzieć, "Cóż, po prostu nie użyję self wtedy". Ale kto wie, jak ta funkcja zmienia się w przyszłości, aby wspierać nowe argumenty. Być może Twoja nazwa kolumny będzie argumentem w nowej aktualizacji pand, powodując problemy z aktualizacją.

 20
Author: firelynx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-03 08:59:22

Jeśli chcesz ustawić całą nową kolumnę na początkową wartość bazową( np. None), możesz to zrobić: df1['e'] = None

To faktycznie przypisałoby Typ" object " do komórki. Później możesz dowolnie umieszczać złożone typy danych, takie jak lista, w poszczególnych komórkach.

 16
Author: digdug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 20:51:00

Dostałem przerażony SettingWithCopyWarning, i nie został naprawiony za pomocą składni iloc. Mój DataFrame został stworzony przez read_sql ze źródła ODBC. Korzystając z sugestii lowtech powyżej, następujące zadziałało dla mnie:

df.insert(len(df.columns), 'e', pd.Series(np.random.randn(sLength),  index=df.index))

To działało dobrze, aby wstawić kolumnę na końcu. Nie wiem, czy jest najskuteczniejszy, ale nie lubię komunikatów ostrzegawczych. Myślę, że jest lepsze rozwiązanie, ale nie mogę go znaleźć i myślę, że zależy to od jakiegoś aspektu indeksu.
Uwaga . Że to działa tylko raz i wyświetli komunikat o błędzie, jeśli próbuje zastąpić istniejącą kolumnę.
Uwaga jak wyżej i od 0.16.0 przypisanie jest najlepszym rozwiązaniem. Zobacz dokumentację http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign Działa dobrze dla typu przepływu danych, w którym nie nadpisuje się wartości pośrednich.

 15
Author: hum3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-21 11:32:43

Niezawodny:

df.loc[:, 'NewCol'] = 'New_Val'

Przykład:

df = pd.DataFrame(data=np.random.randn(20, 4), columns=['A', 'B', 'C', 'D'])

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
3  -0.147354  0.778707  0.479145  2.284143
4  -0.529529  0.000571  0.913779  1.395894
5   2.592400  0.637253  1.441096 -0.631468
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
8   0.606985 -2.232903 -1.358107 -2.855494
9  -0.692013  0.671866  1.179466 -1.180351
10 -1.093707 -0.530600  0.182926 -1.296494
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
18  0.693458  0.144327  0.329500 -0.655045
19  0.104425  0.037412  0.450598 -0.923387


df.drop([3, 5, 8, 10, 18], inplace=True)

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
4  -0.529529  0.000571  0.913779  1.395894
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
9  -0.692013  0.671866  1.179466 -1.180351
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
19  0.104425  0.037412  0.450598 -0.923387

df.loc[:, 'NewCol'] = 0

df
           A         B         C         D  NewCol
0  -0.761269  0.477348  1.170614  0.752714       0
1   1.217250 -0.930860 -0.769324 -0.408642       0
2  -0.619679 -1.227659 -0.259135  1.700294       0
4  -0.529529  0.000571  0.913779  1.395894       0
6   0.757178  0.240012 -0.553820  1.177202       0
7  -0.986128 -1.313843  0.788589 -0.707836       0
9  -0.692013  0.671866  1.179466 -1.180351       0
11 -0.143273 -0.503199 -1.328728  0.610552       0
12 -0.923110 -1.365890 -1.366202 -1.185999       0
13 -2.026832  0.273593 -0.440426 -0.627423       0
14 -0.054503 -0.788866 -0.228088 -0.404783       0
15  0.955298 -1.430019  1.434071 -0.088215       0
16 -0.227946  0.047462  0.373573 -0.111675       0
17  1.627912  0.043611  1.743403 -0.012714       0
19  0.104425  0.037412  0.450598 -0.923387       0
 7
Author: K88,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 11:22:03

Jeśli kolumna, którą próbujesz dodać jest zmienną szeregową, to po prostu:

df["new_columns_name"]=series_variable_name #this will do it for you

To działa dobrze, nawet jeśli zastępujesz istniejącą kolumnę.po prostu wpisz new_columns_name tak samo jak Kolumna, którą chcesz replace.It zastąpi istniejące dane kolumn nowymi danymi serii.

 7
Author: Akshay Singhvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-03 10:44:11

Dodam tylko, że tak jak dla hum3, .loc nie rozwiązałem SettingWithCopyWarning i musiałem uciekać się do df.insert(). W moim przypadku false positive zostało wygenerowane przez" fake " indeksowanie łańcucha dict['a']['e'], Gdzie 'e' jest nową kolumną, a dict['a'] jest ramką danych pochodzącą ze słownika.

Należy również pamiętać, że jeśli wiesz, co robisz, można przełączyć Ostrzeżenie za pomocą pd.options.mode.chained_assignment = None a następnie użyć jednego z innych rozwiązań podanych tutaj.

 6
Author: kkumer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:36

Jeśli ramka danych i obiekt szeregowy mają ten sam indeks, pandas.concat działa również tutaj:

import pandas as pd
df
#          a            b           c           d
#0  0.671399     0.101208   -0.181532    0.241273
#1  0.446172    -0.243316    0.051767    1.577318
#2  0.614758     0.075793   -0.451460   -0.012493

e = pd.Series([-0.335485, -1.166658, -0.385571])    
e
#0   -0.335485
#1   -1.166658
#2   -0.385571
#dtype: float64

# here we need to give the series object a name which converts to the new  column name 
# in the result
df = pd.concat([df, e.rename("e")], axis=1)
df

#          a            b           c           d           e
#0  0.671399     0.101208   -0.181532    0.241273   -0.335485
#1  0.446172    -0.243316    0.051767    1.577318   -1.166658
#2  0.614758     0.075793   -0.451460   -0.012493   -0.385571

W przypadku, gdy nie mają tego samego indeksu:

e.index = df.index
df = pd.concat([df, e.rename("e")], axis=1)
 6
Author: Psidom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 01:46:08
  1. najpierw Utwórz list_of_e Pythona, który zawiera odpowiednie dane.
  2. Użyj tego: df ['e'] = list_of_e
 6
Author: Sumit Pokhrel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-22 11:54:49

Przed przypisaniem nowej kolumny, jeśli masz zindeksowane dane, musisz posortować indeks. Przynajmniej w moim przypadku musiałem:

data.set_index(['index_column'], inplace=True)
"if index is unsorted, assignment of a new column will fail"        
data.sort_index(inplace = True)
data.loc['index_value1', 'column_y'] = np.random.randn(data.loc['index_value1', 'column_x'].shape[0])
 5
Author: Dima Lituiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 20:27:15

Należy jednak pamiętać, że jeśli zrobisz

df1['e'] = Series(np.random.randn(sLength), index=df1.index)
/ Align= "left" / indeks. Więc jeśli chcesz mieć zewnętrzny efekt join, moim prawdopodobnie niedoskonałym rozwiązaniem jest stworzenie ramki danych z wartościami indeksu obejmującymi wszechświat Twoich danych, a następnie użycie powyższego kodu. Na przykład,
data = pd.DataFrame(index=all_possible_values)
df1['e'] = Series(np.random.randn(sLength), index=df1.index)
 5
Author: WillZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 13:05:50

Aby dodać nową kolumnę "e" do istniejącej ramki danych

 df1.loc[:,'e'] = Series(np.random.randn(sLength))
 4
Author: Chirag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-04 21:50:29

Szukałem ogólnego sposobu na dodanie kolumny numpy.nan s do ramki danych bez uzyskania głupiego SettingWithCopyWarning.

Z następujących:

  • odpowiedzi tutaj
  • to pytanie o podanie zmiennej jako argumentu słowa kluczowego
  • ta metoda do generowania numpy tablicy Nan w linii

Wymyśliłem to:

col = 'column_name'
df = df.assign(**{col:numpy.full(len(df), numpy.nan)})
 4
Author: ryanjdillon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:42

Ze względu na kompletność-jeszcze jedno rozwiązanie z wykorzystaniem ramki danych .metoda eval () :

Data:

In [44]: e
Out[44]:
0    1.225506
1   -1.033944
2   -0.498953
3   -0.373332
4    0.615030
5   -0.622436
dtype: float64

In [45]: df1
Out[45]:
          a         b         c         d
0 -0.634222 -0.103264  0.745069  0.801288
4  0.782387 -0.090279  0.757662 -0.602408
5 -0.117456  2.124496  1.057301  0.765466
7  0.767532  0.104304 -0.586850  1.051297
8 -0.103272  0.958334  1.163092  1.182315
9 -0.616254  0.296678 -0.112027  0.679112

Rozwiązanie:

In [46]: df1.eval("e = @e.values", inplace=True)

In [47]: df1
Out[47]:
          a         b         c         d         e
0 -0.634222 -0.103264  0.745069  0.801288  1.225506
4  0.782387 -0.090279  0.757662 -0.602408 -1.033944
5 -0.117456  2.124496  1.057301  0.765466 -0.498953
7  0.767532  0.104304 -0.586850  1.051297 -0.373332
8 -0.103272  0.958334  1.163092  1.182315  0.615030
9 -0.616254  0.296678 -0.112027  0.679112 -0.622436
 4
Author: MaxU,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 21:49:44

Oto co zrobiłem... Ale jestem całkiem nowy w pandach i naprawdę Pythonie w ogóle, więc żadnych obietnic.

df = pd.DataFrame([[1, 2], [3, 4], [5,6]], columns=list('AB'))

newCol = [3,5,7]
newName = 'C'

values = np.insert(df.values,df.shape[1],newCol,axis=1)
header = df.columns.values.tolist()
header.append(newName)

df = pd.DataFrame(values,columns=header)
 3
Author: Devin Charles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-20 13:07:47

Jeśli otrzymasz SettingWithCopyWarning, łatwą poprawką jest skopiowanie ramki danych, do której próbujesz dodać kolumnę.

df = df.copy()
df['col_name'] = values
 3
Author: fredcallaway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-07 04:00:33

Najprostsze sposoby:-

Data ['new_col'] = list_of_values

Data.loc [:, 'new_col'] = list_of_values

 1
Author: Abhishek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 05:17:14