Anda dapat menggunakan DataFrame
konstruktor dengan lists
dibuat oleh to_list
:
import pandas as pd
d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']]}
df2 = pd.DataFrame(d1)
print (df2)
teams
0 [SF, NYG]
1 [SF, NYG]
2 [SF, NYG]
3 [SF, NYG]
4 [SF, NYG]
5 [SF, NYG]
6 [SF, NYG]
df2[['team1','team2']] = pd.DataFrame(df2.teams.tolist(), index= df2.index)
print (df2)
teams team1 team2
0 [SF, NYG] SF NYG
1 [SF, NYG] SF NYG
2 [SF, NYG] SF NYG
3 [SF, NYG] SF NYG
4 [SF, NYG] SF NYG
5 [SF, NYG] SF NYG
6 [SF, NYG] SF NYG
Dan untuk yang baru DataFrame
:
df3 = pd.DataFrame(df2['teams'].to_list(), columns=['team1','team2'])
print (df3)
team1 team2
0 SF NYG
1 SF NYG
2 SF NYG
3 SF NYG
4 SF NYG
5 SF NYG
6 SF NYG
Solusi dengan apply(pd.Series)
sangat lambat:
#7k rows
df2 = pd.concat([df2]*1000).reset_index(drop=True)
In [121]: %timeit df2['teams'].apply(pd.Series)
1.79 s ± 52.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [122]: %timeit pd.DataFrame(df2['teams'].to_list(), columns=['team1','team2'])
1.63 ms ± 54.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
apply()
mungkin lebih lambat tetapi merupakan metode masuk ketika string input dan nilai tidak sama di seluruh baris Seri asli!Solusi yang jauh lebih sederhana:
Hasil,
Jika Anda ingin memisahkan kolom dari string yang dipisahkan daripada daftar, Anda dapat melakukan hal yang sama:
sumber
df["teams"].str.split('<delim>', expand=True)
sudah mengembalikan DataFrame, jadi mungkin akan lebih mudah dengan hanya mengganti nama kolom.Solusi ini mempertahankan indeks
df2
DataFrame, tidak seperti solusi apa pun yang menggunakantolist()
:Inilah hasilnya:
sumber
apply
yang dapat Anda lakukan di panda. Anda harus menghindari metode ini dan menggunakan jawaban yang diterima. Dalam pengaturan waktu jawaban teratas, metode ini kira-kira1400 x
lebih lambat @rajanapply
metode ini bekerja lebih andal untuk memperluas array besar (1000+ item) pada kumpulan data besar. Thetolist()
Metode membunuh proses saya ketika kumpulan data melebihi 500k baris.pd.DataFrame(df["teams"].to_list(), columns=["team_1", "team_2"])
benar-benar jauh lebih rumit?Tampaknya ada cara yang lebih sederhana secara sintaksis, dan oleh karena itu lebih mudah diingat, dibandingkan dengan solusi yang diusulkan. Saya berasumsi bahwa kolom tersebut disebut 'meta' dalam dataframe df:
sumber
str.split()
. Ini jauh lebih sederhana dan memiliki keuntungan jika Anda tidak mengetahui jumlah item dalam daftar Anda.Berdasarkan jawaban sebelumnya, berikut adalah solusi lain yang mengembalikan hasil yang sama seperti df2.teams.apply (pd.Series) dengan waktu proses yang jauh lebih cepat:
Waktu:
sumber
Solusi di atas tidak berhasil untuk saya karena saya memiliki
nan
pengamatan di sayadataframe
. Dalam kasus sayadf2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
menghasilkan:Saya menyelesaikan ini menggunakan pemahaman daftar. Berikut contoh yang dapat direplikasi:
keluaran:
menyelesaikan dengan pemahaman daftar:
hasil:
sumber
pemahaman daftar
implementasi sederhana dengan pemahaman daftar (favorit saya)
waktu pada keluaran:
keluaran:
sumber
Berikut solusi lain menggunakan
df.transform
dandf.set_index
:sumber