Mam SF z serii Pandas:
email
[email protected] [1.0, 0.0, 0.0]
[email protected] [2.0, 0.0, 0.0]
[email protected] [1.0, 0.0, 0.0]
[email protected] [4.0, 0.0, 0.0]
[email protected] [1.0, 0.0, 3.0]
[email protected] [1.0, 5.0, 0.0]
Chciałbym przekształcić go w następującą ramkę DataFrame:
index | email | list
_____________________________________________
0 | [email protected] | [1.0, 0.0, 0.0]
1 | [email protected] | [2.0, 0.0, 0.0]
2 | [email protected] | [1.0, 0.0, 0.0]
3 | [email protected] | [4.0, 0.0, 0.0]
4 | [email protected] | [1.0, 0.0, 3.0]
5 | [email protected] | [1.0, 5.0, 0.0]
Znalazłem sposób, żeby to zrobić, ale wątpię, żeby był wydajniejszy:
df1 = pd.DataFrame(data=sf.index, columns=['email'])
df2 = pd.DataFrame(data=sf.values, columns=['list'])
df = pd.merge(df1, df2, left_index=True, right_index=True)
reset_index
połączenia .Odpowiedzi:
Zamiast tworzyć 2 tymczasowe pliki df, możesz po prostu przekazać je jako parametry w dykt, używając konstruktora DataFrame:
pd.DataFrame({'email':sf.index, 'list':sf.values})
Istnieje wiele sposobów tworzenia df, zobacz dokumentację
źródło
pd.concat([sf.index, sf.values], axis=1)
to_frame () :
Począwszy od następującej serii, df:
Używam to_frame do konwersji serii na DataFrame:
df = df.to_frame().reset_index() email 0 0 [email protected] A 1 [email protected] B 2 [email protected] C 3 [email protected] D
Teraz wszystko, czego potrzebujesz, to zmienić nazwę kolumny i nazwać kolumnę indeksu:
df = df.rename(columns= {0: 'list'}) df.index.name = 'index'
Twoja ramka DataFrame jest gotowa do dalszej analizy.
Aktualizacja: właśnie trafiłem na ten link, w którym odpowiedzi są zaskakująco podobne do moich tutaj.
źródło
series_obj.to_frame()
Pracuje! Wypisuję ten typ klasy<class 'pandas.core.frame.DataFrame'>
to_frame().reset_index()
a nie tylkoreset_index
? Możesz nawet po prostu zrobićreset_index(name='list')
Series.reset_index
zname
argumentemCzęsto pojawia się przypadek użycia, w którym seria musi zostać promowana do ramki DataFrame. Ale jeśli seria nie ma nazwy,
reset_index
spowoduje to, żes = pd.Series([1, 2, 3], index=['a', 'b', 'c']).rename_axis('A') s A a 1 b 2 c 3 dtype: int64
s.reset_index() A 0 0 a 1 1 b 2 2 c 3
Tam, gdzie widzisz, nazwa kolumny to „0”. Możemy to naprawić, określając
name
parametr.s.reset_index(name='B') A B 0 a 1 1 b 2 2 c 3
s.reset_index(name='list') A list 0 a 1 1 b 2 2 c 3
Series.to_frame
Jeśli chcesz utworzyć ramkę danych bez podwyższania indeksu do kolumny, użyj
Series.to_frame
, zgodnie z sugestią w tej odpowiedzi . To również obsługuje parametr name.s.to_frame(name='B') B A a 1 b 2 c 3
pd.DataFrame
KonstruktorMożesz też zrobić to samo, co
Series.to_frame
podająccolumns
parametr:pd.DataFrame(s, columns=['B']) B A a 1 b 2 c 3
źródło
to_frame
zamiastreset_index
, ale czy istnieje dobry powód, aby używać obu? tutajto_frame
nie wydaje się mieć argumentu, żeby to zrobić. Dzięki.Jedna linia odpowiedzi brzmiałaby
myseries.to_frame(name='my_column_name')
Lub
myseries.reset_index(drop=True, inplace=True) # As needed
źródło
Series.to_frame
można użyć do konwersji aSeries
doDataFrame
.# The provided name (columnName) will substitute the series name df = series.to_frame('columnName')
Na przykład,
s = pd.Series(["a", "b", "c"], name="vals") df = s.to_frame('newCol') print(df) newCol 0 a 1 b 2 c
źródło
prawdopodobnie ocenione jako sposób inny niż Python, ale to da wynik, który chcesz w linii:
Wynik:
email list 0 [email protected] [1.0, 0.0, 0.0] 1 [email protected] [2.0, 0.0, 0.0] 2 [email protected] [1.0, 0.0, 0.0] 3 [email protected] [4.0, 0.0, 3.0] 4 [email protected] [1.0, 5.0, 0.0]
źródło