Łączenie dwóch serii w ramkę danych w pandach

278

Mam dwie Serie s1i s2te same (nie następujące po sobie) wskaźniki. Jak połączyć s1i s2być dwiema kolumnami w ramce danych i zachować jeden z indeksów jako trzecią kolumnę?

użytkownik7289
źródło

Odpowiedzi:

416

Myślę, że concatto dobry sposób na zrobienie tego. Jeśli są obecne, używa atrybutów nazw Serii jako kolumn (w przeciwnym razie po prostu je numeruje):

In [1]: s1 = pd.Series([1, 2], index=['A', 'B'], name='s1')

In [2]: s2 = pd.Series([3, 4], index=['A', 'B'], name='s2')

In [3]: pd.concat([s1, s2], axis=1)
Out[3]:
   s1  s2
A   1   3
B   2   4

In [4]: pd.concat([s1, s2], axis=1).reset_index()
Out[4]:
  index  s1  s2
0     A   1   3
1     B   2   4

Uwaga: dotyczy to więcej niż 2 serii.

Andy Hayden
źródło
5
pozwala to uniknąć kopiowania (w porównaniu z rozwiązaniem dict)
Jeff
W jednym przypadku wydaje mi się, że mówi mi „ValueError: Wartość prawdy tablicy z więcej niż jednym elementem jest niejednoznaczna. Użyj a.any () lub a.all () '- jakieś pomysły?
user7289,
@ user7289 nie jestem pewien, skąd by to pochodziło, czy możesz zadać to pytanie jako kolejne?
Andy Hayden
@AndyHayden: co zrobić, jeśli istnieją duplikaty wzdłuż jednego lub obu indeksów?
Mannaggia
2
@dafinguzman, co oznacza „ciągłe ponowne korzystanie z tej funkcji”, oznacza, że ​​powinieneś preferować wykonanie konkat raz pd.concat([list_of_dataframes]) kontra konkatowanie wiele razy new_df = pd.DataFrame(); for df in list_of_dsf: new_df = pd.concat([new_df, df])lub podobnie.
Andy Hayden
38

Dlaczego nie użyjesz .to_frame, jeśli oba mają te same indeksy?

> = v0.23

a.to_frame().join(b)

< v0.23

a.to_frame().join(b.to_frame())
swmfg
źródło
4
Może byłoby to bardziej odpowiednie: a.to_frame (name = 'a'). Join (b.to_frame (name = 'b'))
user3282777
33

Pandy automatycznie dopasują te przekazywane szeregowo i utworzą wspólny indeks. Zdarza się, że tutaj są takie same. reset_indexprzenosi indeks do kolumny.

In [2]: s1 = Series(randn(5),index=[1,2,4,5,6])

In [4]: s2 = Series(randn(5),index=[1,2,4,5,6])

In [8]: DataFrame(dict(s1 = s1, s2 = s2)).reset_index()
Out[8]: 
   index        s1        s2
0      1 -0.176143  0.128635
1      2 -1.286470  0.908497
2      4 -0.995881  0.528050
3      5  0.402241  0.458870
4      6  0.380457  0.072251
Jeff
źródło
16

Przykładowy kod:

a = pd.Series([1,2,3,4], index=[7,2,8,9])
b = pd.Series([5,6,7,8], index=[7,2,8,9])
data = pd.DataFrame({'a': a,'b':b, 'idx_col':a.index})

Pandy pozwalają tworzyć DataFramez dictza Seriesjako wartości i nazwy kolumn jako klucze. Gdy znajdzie Seriesjako wartość, używa Seriesindeksu jako części DataFrameindeksu. To wyrównanie danych jest jednym z głównych atutów Pand. W konsekwencji, chyba że masz inne potrzeby, świeżo utworzona DataFramema zduplikowaną wartość. W powyższym przykładzie data['idx_col']ma te same dane, co data.index.

jbn
źródło
13

Jeśli mogę na to odpowiedzieć.

Podstawą konwersji serii na ramkę danych jest zrozumienie tego

1. Na poziomie koncepcyjnym każda kolumna w ramce danych jest serią.

2. I każda nazwa kolumny to nazwa klucza, która jest odwzorowana na serię.

Jeśli pamiętasz o dwóch koncepcjach, możesz pomyśleć o wielu sposobach konwersji serii na ramkę danych. Jedno proste rozwiązanie będzie takie:

Utwórz tutaj dwie serie

import pandas as pd

series_1 = pd.Series(list(range(10)))

series_2 = pd.Series(list(range(20,30)))

Utwórz pustą ramkę danych z żądanymi nazwami kolumn

df = pd.DataFrame(columns = ['Column_name#1', 'Column_name#1'])

Umieść wartość szeregu w ramce danych za pomocą koncepcji mapowania

df['Column_name#1'] = series_1

df['Column_name#2'] = series_2

Sprawdź wyniki teraz

df.head(5)
Sateesh
źródło
6

Nie jestem pewien, czy w pełni rozumiem twoje pytanie, ale czy właśnie to chcesz zrobić?

pd.DataFrame(data=dict(s1=s1, s2=s2), index=s1.index)

( index=s1.indexnie jest tu nawet konieczne)

Bertrand L.
źródło
3

Uproszczenie rozwiązania oparte na join():

df = a.to_frame().join(b)
Lorenzo A. Rossi
źródło
1

Użyłem pand, aby przekonwertować moją tablicę numpy lub iseries na ramkę danych, a następnie dodałem dodatkową kolumnę według klucza jako „przewidywanie”. Jeśli potrzebujesz przekonwertować ramkę danych z powrotem na listę, użyj wartości.tolist ()

output=pd.DataFrame(X_test)
output['prediction']=y_pred

list=output.values.tolist()     
złoty Lew
źródło