Ładuję niektóre dane uczenia maszynowego z pliku CSV. Pierwsze 2 kolumny to obserwacje, a pozostałe kolumny to cechy.
Obecnie wykonuję następujące czynności:
data = pandas.read_csv('mydata.csv')
co daje coś takiego:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Chciałbym ten dataframe pokroić w dwóch dataframes: jedna zawiera kolumny a
i b
jeden zawierający kolumny c
, d
i e
.
Nie można napisać czegoś takiego
observations = data[:'c']
features = data['c':]
Nie jestem pewien, jaka jest najlepsza metoda. Czy potrzebuję pd.Panel
?
Nawiasem mówiąc, uważam, że indeksowanie ramek danych jest dość niespójne: data['a']
jest dozwolone, ale data[0]
nie jest. Z drugiej strony data['a':]
nie jest dozwolone, ale data[0:]
jest. Czy jest tego praktyczny powód? Jest to naprawdę mylące, jeśli kolumny są indeksowane przez Int, biorąc pod uwagę todata[0] != data[0:1]
df[5:10]
dodano pewne udogodnienia, np. Dodano do wybierania wierszy ( pandas.pydata.org/pandas-docs/stable/… )Odpowiedzi:
Odpowiedź 2017 - pandy 0.20: .ix jest przestarzałe. Użyj .loc
Zobacz wycofanie w dokumentach
.loc
używa indeksowania opartego na etykietach, aby wybrać zarówno wiersze, jak i kolumny. Etykiety będące wartościami indeksu lub kolumn. Krojenie za pomocą.loc
obejmuje ostatni element..loc
akceptuje ten sam zapis wycinka, co listy Python dla wierszy i kolumn. Notacja plastra jeststart:stop:step
Możesz pokroić według wierszy i kolumn. Na przykład, jeśli masz 5 wierszy z etykietami
v
,w
,x
,y
,z
źródło
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
wtedy możesz wmyfunc(row){
... użyćrow['foo':'ant']
. na przykład (zgodnie z odpowiedzią StackOverflow ), wewnątrzmyfunc
można dokonać oceny, jeśli którykolwiek z nich jest nienumeryczny:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
.iloc
należy użyć teraz zamiast.loc
. Napraw to, a ja to poprę.Uwaga:
.ix
jest przestarzałe od Pandas v0.20. Zamiast tego powinieneś użyć.loc
lub.iloc
, odpowiednio.Indeks DataFrame.ix jest tym, do którego chcesz uzyskać dostęp. Jest to trochę mylące (zgadzam się, że indeksowanie Pand jest czasem kłopotliwe!), Ale wydaje się, że następujące działania są takie, jak chcesz:
gdzie .ix [wycinek wiersza, wycinek kolumny] jest interpretowany. Więcej informacji na temat indeksowania pand tutaj: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
źródło
>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
df.ix[:,[0,3,4]]
df.ix[:,'b':'e']
?loc
zamiastix
: stackoverflow.com/a/31593712/4323Jako przykładu wykorzystajmy tytaniczny zestaw danych z pakietu dna morskiego
lub
źródło
.ix
jest przestarzałe.Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.
df.loc[:, some_list_of_columns]
Ponadto, biorąc pod uwagę DataFrame
tak jak w twoim przykładzie, jeśli chcesz wyodrębnić tylko kolumnę aid (tj. pierwszą i czwartą kolumnę), iloc mothod z ramki danych pand jest tym, czego potrzebujesz i można go bardzo skutecznie wykorzystać. Wszystko, co musisz wiedzieć, to indeks kolumn, które chcesz wyodrębnić. Na przykład:
da tobie
źródło
Możesz pokroić wzdłuż kolumn a
DataFrame
, odwołując się do nazw każdej kolumny na liście, na przykład:źródło
get_loc
funkcji on,data.columns
aby określić indeks kolumny „b” lub cokolwiek innego.A jeśli przyszedłeś tu po to, aby przeciąć dwa zakresy kolumn i połączyć je razem (jak ja), możesz zrobić coś takiego
Spowoduje to utworzenie nowej ramki danych z pierwszymi 900 kolumnami i (wszystkimi) kolumnami> 3593 (zakładając, że masz około 4000 kolumn w zestawie danych).
źródło
Oto, w jaki sposób można użyć różnych metod do selektywnego segmentowania kolumn, w tym selektywnego segmentowania opartego na etykietach, indeksowania i zakresów selektywnych.
źródło
Jest to odpowiednik
źródło
jeśli ramka danych wygląda tak:
i OUTPUT może być jak
jeśli używasz operatora logicznego np.logical_not
Więcej na temat
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
inne operatory logiczne
logical_and (x1, x2, / [, out, where, ...]) Oblicz wartość prawdy dla elementów x1 AND x2.
logical_or (x1, x2, / [, out, where, casting, ...]) Oblicz wartość prawdy dla x1 LUB x2 w odniesieniu do elementu.
źródło
Innym sposobem uzyskania podzbiór kolumn z DataFrame, zakładając, że chcesz wszystkie wiersze, byłoby to zrobić:
data[['a','b']]
adata[['c','d','e']]
Jeśli chcesz użyć liczbowych indeksów kolumn można zrobić:
data[data.columns[:2]]
idata[data.columns[2:]]
źródło