Mam ramkę danych z kilkoma kolumnami takimi jak ta:
A B C
0
4
5
6
7
7
6
5
Dopuszczalny zakres wartości w tylko od 0 do 7 .
Mam też listę 8 elementów, takich jak ta:
List=[2,5,6,8,12,16,26,32] //There are only 8 elements in this list
Jeśli element w kolumnie A to n , muszę wstawić n- ty element z listy do nowej kolumny, powiedz „D”.
Jak mogę to zrobić za jednym razem bez zapętlania się po całej ramce danych?
Wynikowa ramka danych wyglądałaby następująco:
A B C D
0 2
4 12
5 16
6 26
7 32
7 32
6 26
5 16
Uwaga: ramka danych jest ogromna, a iteracja jest ostatnią opcją. Ale w razie potrzeby mogę również ułożyć elementy w „Liście” w dowolnej innej strukturze danych, takiej jak dict.
Odpowiedzi:
IIUC, jeśli zmienisz swój (niestety nazwany)
List
na anndarray
, możesz po prostu naturalnie go indeksować.>>> import numpy as np >>> m = np.arange(16)*10 >>> m[df.A] array([ 0, 40, 50, 60, 150, 150, 140, 130]) >>> df["D"] = m[df.A] >>> df A B C D 0 0 NaN NaN 0 1 4 NaN NaN 40 2 5 NaN NaN 50 3 6 NaN NaN 60 4 15 NaN NaN 150 5 15 NaN NaN 150 6 14 NaN NaN 140 7 13 NaN NaN 130
Tutaj zbudowałem nowy
m
, ale jeśli użyjeszm = np.asarray(List)
, to samo powinno działać: wartości wdf.A
dobiorą odpowiednie elementym
.Zauważ, że jeśli używasz starej wersji
numpy
, być może będziesz musiał użyćm[df.A.values]
zamiast tego - w przeszłościnumpy
nie grało dobrze z innymi, a niektóre refaktoryzacjepandas
powodowały bóle głowy. Teraz sytuacja się poprawiła.źródło
Traceback (most recent call last):
File "./b.py", line 24, in <module>
d["D"] = m[d.A]
IndexError: unsupported iterator index
numpy
błąd. Działad["D"] = m[d.A.values]
dla Ciebie?Po prostu przypisz listę bezpośrednio:
df['new_col'] = mylist
Alternatywa
Przekonwertuj listę na serię lub tablicę, a następnie przypisz:
se = pd.Series(mylist) df['new_col'] = se.values
lub
df['new_col'] = np.array(mylist)
źródło
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
pd.Series
efektu dtype ? Mam na myśli, czy pozostawi pływaki jako pływaki, a struny jako struny? A może elementy na liście będą domyślnie łańcuchami?Rozwiązanie ulepszone w stosunku do świetnego od @sparrow.
Niech df będzie twoim zbiorem danych, i wymień listę z wartościami, które chcesz dodać do ramki danych.
Załóżmy, że chcesz nazwać swoją nową kolumnę po prostu nową_kolumną
Najpierw ułóż listę w serię:
Następnie użyj funkcji wstawiania, aby dodać kolumnę. Ta funkcja ma tę zaletę, że pozwala wybrać pozycję, w której chcesz umieścić kolumnę. W poniższym przykładzie umieścimy nową kolumnę na pierwszej pozycji od lewej (ustawiając loc = 0)
df.insert(loc=0, column='new_column', value=column_values)
źródło
Najpierw utwórzmy ramkę danych, którą miałeś, zignoruję kolumny B i C, ponieważ nie są one istotne.
df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]})
I mapowanie, które chcesz:
mapping = dict(enumerate([2,5,6,8,12,16,26,32])) df['D'] = df['A'].map(mapping)
Gotowe!
print df
Wynik:
A D 0 0 2 1 4 12 2 5 16 3 6 26 4 7 32 5 7 32 6 6 26 7 5 16
źródło
D
z elementówA
iList
(„Jeśli element w kolumnie A to n, muszę wstawić n-ty element z listy do nowej kolumny, powiedzieć„ D ”.”)np.array(List)[df.A]
idf["A"].map(dict(enumerate(List)))
jest głównie kwestią preferencji.Stare pytanie; ale zawsze staram się używać najszybszego kodu!
Miałem ogromną listę z 69 milionami plików uint64. np.array () był dla mnie najszybszy.
df['hashes'] = hashes Time spent: 17.034842014312744 df['hashes'] = pd.Series(hashes).values Time spent: 17.141014337539673 df['key'] = np.array(hashes) Time spent: 10.724546194076538
źródło