Diberikan DataFrame:
np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df
A B C
1 1.764052 0.400157 0.978738
2 2.240893 1.867558 -0.977278
3 0.950088 -0.151357 -0.103219
Apa cara termudah untuk menambahkan kolom baru yang berisi nilai konstan misalnya 0?
A B C new
1 1.764052 0.400157 0.978738 0
2 2.240893 1.867558 -0.977278 0
3 0.950088 -0.151357 -0.103219 0
Ini adalah solusi saya, tetapi saya tidak tahu mengapa ini menempatkan NaN ke kolom 'baru'?
df['new'] = pd.Series([0 for x in range(len(df.index))])
A B C new
1 1.764052 0.400157 0.978738 0.0
2 2.240893 1.867558 -0.977278 0.0
3 0.950088 -0.151357 -0.103219 NaN
df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index)
.[0] * len(df.index)
df['new'] = 0
Jawaban:
Alasan hal ini dimasukkan
NaN
ke dalam kolom adalah karenadf.index
dan objek sisiIndex
kanan Anda berbeda. @zach menunjukkan cara yang tepat untuk menetapkan kolom nol baru. Secara umum,pandas
coba lakukan penyelarasan indeks sebanyak mungkin. Satu sisi negatifnya adalah ketika indeks tidak selaras, Anda akan mendapatkan apaNaN
pun yang tidak selaras. Bermain-main dengan metodereindex
danalign
untuk mendapatkan beberapa intuisi untuk pekerjaan penyelarasan dengan objek yang memiliki indeks selaras sebagian, total, dan tidak-semua. Misalnya, inilah caraDataFrame.align()
bekerja dengan indeks yang rata sebagian:In [7]: from pandas import DataFrame In [8]: from numpy.random import randint In [9]: df = DataFrame({'a': randint(3, size=10)}) In [10]: In [10]: df Out[10]: a 0 0 1 2 2 0 3 1 4 0 5 0 6 0 7 0 8 0 9 0 In [11]: s = df.a[:5] In [12]: dfa, sa = df.align(s, axis=0) In [13]: dfa Out[13]: a 0 0 1 2 2 0 3 1 4 0 5 0 6 0 7 0 8 0 9 0 In [14]: sa Out[14]: 0 0 1 2 2 0 3 1 4 0 5 NaN 6 NaN 7 NaN 8 NaN 9 NaN Name: a, dtype: float64
sumber
Penugasan di tempat yang sangat sederhana:
df['new'] = 0
Untuk modifikasi di tempat, lakukan penugasan langsung. Tugas ini disiarkan oleh panda untuk setiap baris.
df = pd.DataFrame('x', index=range(4), columns=list('ABC')) df A B C 0 x x x 1 x x x 2 x x x 3 x x x
df['new'] = 'y' # Same as, # df.loc[:, 'new'] = 'y' df A B C new 0 x x x y 1 x x x y 2 x x x y 3 x x x y
Catatan untuk kolom objek
Jika Anda ingin menambahkan kolom daftar kosong, inilah saran saya:
object
kolom adalah berita buruk dalam hal kinerja. Pikirkan kembali bagaimana data Anda terstruktur.Jika Anda harus menyimpan kolom daftar, pastikan untuk tidak menyalin referensi yang sama beberapa kali.
# Wrong df['new'] = [[]] * len(df) # Right df['new'] = [[] for _ in range(len(df))]
Menghasilkan salinan:
df.assign(new=0)
Jika Anda membutuhkan salinan, gunakan
DataFrame.assign
:df.assign(new='y') A B C new 0 x x x y 1 x x x y 2 x x x y 3 x x x y
Dan, jika Anda perlu menetapkan beberapa kolom dengan nilai yang sama, ini sesederhana,
c = ['new1', 'new2', ...] df.assign(**dict.fromkeys(c, 'y')) A B C new1 new2 0 x x x y y 1 x x x y y 2 x x x y y 3 x x x y y
Tugas beberapa kolom
Terakhir, jika Anda perlu menetapkan beberapa kolom dengan nilai yang berbeda, Anda dapat menggunakan
assign
kamus.c = {'new1': 'w', 'new2': 'y', 'new3': 'z'} df.assign(**c) A B C new1 new2 new3 0 x x x w y z 1 x x x w y z 2 x x x w y z 3 x x x w y z
sumber
Dengan panda modern, Anda dapat melakukan:
df['new'] = 0
sumber
Berikut ini satu liner lain yang menggunakan lambda (buat kolom dengan nilai konstan = 10)
df['newCol'] = df.apply(lambda x: 10, axis=1)
sebelum
df A B C 1 1.764052 0.400157 0.978738 2 2.240893 1.867558 -0.977278 3 0.950088 -0.151357 -0.103219
setelah
df A B C newCol 1 1.764052 0.400157 0.978738 10 2 2.240893 1.867558 -0.977278 10 3 0.950088 -0.151357 -0.103219 10
sumber
df['newCol'] = 10
juga merupakan satu liner (dan lebih cepat). Apa keuntungan menggunakan apply di sini?df['new'] = [[] for _ in range(len(df))]