DataFrame panda sütunu silin

DataFrame-də bir sütunu silməkdə istifadə edirəm:

 del df['column_name'] 

Və böyük işləyir. Niyə aşağıdakıları istifadə edə bilmirəm?

 del df.column_name 

df.column_name kimi sütun / seriyaya daxil ola df.column_name üçün işləməyimi gözləyirəm.

896
16 нояб. 16 noyabr tarixində John tərəfindən təyin olunmuşdur. 2012-11-16 09:26 '12 saat 09:26 'da 2012-11-16 09:26
@ 16 cavab

Python-da sintaksis məhdudiyyətləri nəticəsində del df.column_name işini sadəcə etmək çətindir. del df[name] df.__delitem__(name) Python örtükləri altında tərcümə edir.

500
21 нояб. Cavab 21 noyabrda Wes McKinney tərəfindən verilir. 2012-11-21 06:12 '12 at 6:12 2012-11-21 06:12

Pandalarda bunu etmək üçün ən yaxşı üsul drop istifadə etməkdir:

 df = df.drop('column_name', 1) 

Burada 1 ədədi eksen sayı (satırlar üçün 0 və sütunlar üçün 1 ).

Df df bir sütun aradan qaldırılması üçün bunu edə bilərsiniz:

border=0
 df.drop('column_name', axis=1, inplace=True) 

Nəhayət, sütun nöqtəsinə deyil, sütun etiketinə keçmək üçün, məsələn, 1-ci, 2-ci və 4-cü sütunları silməyə cəhd edin:

 df = df.drop(df.columns[[0, 1, 3]], axis=1) # df.columns is zero-based pd.Index 
1646
09 авг. cavab LondonRob 09 avqustda verilir . 2013-08-09 14:12 '13 'da 14:12' də 2013-08-09 14:12

İstifadə edin:

 columns = ['Col1', 'Col2', ...] df.drop(columns, inplace=True, axis=1) 

Bunun yerinə bir və ya bir neçə sütun çıxarılacaq. inplace=True pandas v0.13 əlavə edildi və köhnə versiyalarında işləməyəcəyini unutmayın. Nəticəni bu halda geri verməlisiniz:

 df = df.drop(columns, axis=1) 
192
23 марта '14 в 23:57 2014-03-23 23:57 Cavab Krishna Sankar tərəfindən 23 Mart 2014 23:57 da veriləcək 2014-03-23 ​​23:57

İndeksə görə buraxın

İlk, ikinci və dördüncü sütunları silin:

 df.drop(df.columns[[0,1,3]], axis=1, inplace=True) 

İlk sütunu silin:

 df.drop(df.columns[[0]], axis=1, inplace=True) 

Əlavə inplace parametri mövcuddur ki, mənbə məlumatları surəti yaratmadan dəyişdirilə bilər.

Zərbə endirdi

Sütunları seçin, əlavə edin, silin

Sütun column-name silin:

 df.pop('column-name') 

Nümunələr:

 df = DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6]), ('C', [7,8, 9])], orient='index', columns=['one', 'two', 'three']) 

print df :

  one two three A 1 2 3 B 4 5 6 C 7 8 9 

df.drop(df.columns[[0]], axis=1, inplace=True) print df :

  two three A 2 3 B 5 6 C 8 9 

three = df.pop('three') print df :

  two A 2 B 5 C 8 
87
15 июля '15 в 16:37 2015-07-15 16:37 cavab jezrael 15 iyul, saat 16: 37-da verilir. 2015-07-15 16:37

Burada ortaya çıxan faktiki sual, burada cavabların çoxu tərəfindən buraxılmışdır:

Niyə del df.column_name istifadə edə bilmirəm?

Birincisi, python sehrli üsullarına daxil olmaq üçün bizi tələb edən problemi anlamaq lazımdır.

Wes cavabında qeyd edildiyi kimi, del df['column'] python df.__delitem__('column') sehrli üsulunu göstərir df.__delitem__('column') , sütunu çıxarmaq üçün pandalarda tətbiq olunur

Lakin, python sehrli üsulları haqqında yuxarıda göstərilən linkdə göstərildiyi kimi:

Əslində, del adlandığı qeyri-sabit vəziyyətlər səbəbindən demək olar ki, istifadə edilməyəcək; ehtiyatla istifadə edin!

del df['column_name'] istifadə edilməməsi və ya təşviq edilməməsi lazım olduğunu iddia edə bilərsiniz və beləliklə del df.column_name hətta hesab edilməməlidir.

Ancaq teorik olaraq, del df.column_name sehrli üsulu __delattr__ istifadə edərək pandalarda tətbiq oluna bilər. Bununla belə, bu, müəyyən problemlərin yaranmasına gətirib del df['column_name'] , del df['column_name'] tətbiqinin problemləri artıq daha azdır.

Nümunə vəzifəsi

"Dtypes" və ya "sütunlar" adlı məlumat çərçivəsindəki bir sütun müəyyən edərəm.

Güman ki, bu sütunları silmək istəyirəm.

del df.dtypes , __delattr__ metodunu "dtypes" öznitəsini və ya "dtypes" sütununu silmək kimi qarışdırır.

Bu mövzunun arxasındakı problemlər

  • Dataframe sütunların kolleksiyasıdırmı?
  • Dataframe bir satirik mi?
  • Sütun bir məlumat çərçivəsinin bir atributudur?

Pandas cavabları:

  • Bəli, hər cəhətdən
  • Xeyr, ancaq isterseniz, .ix , .iloc və ya .iloc istifadə edə bilərsiniz.
  • Bəlkə də məlumatları oxumaq istəyirsiniz? Bəli , atribut adı artıq data faylına aid olan başqa bir xüsusiyyət ilə qəbul edilmədikdə. Veriyi dəyişmək istəyirsiniz? Sonra yox .

TL; DR;

del df.column_name , bu bilişsel dissonansın istifadəçilər üçün yaranmadığı üçün yenidən düzəldilməsi lazım olan bir çox inkişaf etmiş bir mimariye malik del df.column_name , del df.column_name edə bilməzsiniz.

Protip:

Df.column_name istifadə etməyin, bu olduqca ola bilər, ancaq bilik dissonansına səbəb olur

Pythonun zenası burada uyğun gəlir:

Sütunu silmək üçün bir neçə yol var.

Bunu etmək üçün bir - və tercihen yalnız bir olmalıdır - sadə bir yol olmalıdır.

Sütunlar bəzən öznitəsidir, lakin bəzən deyil.

Xüsusi hallar qaydaları pozmaq üçün kifayət qədər çətin deyil.

del df.dtypes xüsusiyyətini və ya dtypes sütununu del df.dtypes qaldırırmı?

Qeyri-müəyyənlik qarşısında, tahmin etmək istəməyə qarşı.

55
03 мая '16 в 12:48 2016-05-03 12:48 Cavab atəşə verilir 03 may '16 saat 12:48 2016-05-03 12:48

Gözəl bir əlavə, sütunları yalnız mövcud olduqda buraxma qabiliyyətidir. Beləliklə, daha çox istifadə hallarını əhatə edə bilərsiniz və yalnız mövcud sütunları keçmiş etiketlərdən siləcəkdir:

Yalnız səhvlər əlavə edin = "ignore" , məsələn:

 df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore') 
  • Bu pandalar 0.16.1 və yuxarıdakı bir yenilikdir. Sənədlər burada .
43
03 янв. Cavab eiTan LaVi Jan 03 tərəfindən verilir 2016-01-03 15:29 '16 'da saat 15:29' də 2016-01-03 15:29

0.16.1 versiyasından edə bilərsiniz

 df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore') 
39
30 апр. cavab sushmit verilir 30 Apr 2016-04-30 21:57 '16 saat 21:57 'da 2016-04-30 21:57

Həmişə [] notation istifadə etmək tövsiyə olunur. Bunlardan birincisi öznitelik notasının ( df.column_name ) numaralandırılmış göstəricilər üçün işləməsidir:

 In [1]: df = DataFrame([[1, 2, 3], [4, 5, 6]]) In [2]: df[1] Out[2]: 0 2 1 5 Name: 1 In [3]: df.1 File "<ipython-input-3-e4803c0d1066>", line 1 df.1 ^ SyntaxError: invalid syntax 
25
16 нояб. Cavab 16 noyabrda Andy Hayden tərəfindən verilir. 2012-11-16 14:33 '12 saat 14:33 'da 2012-11-16 14:33

Pandas 0.16.1 + 'də, @eiTanLaVi tərəfindən göndərilən həll üçün mövcud olduqda sütunları tərk edə bilərsiniz. Bu versiyadan əvvəl şərtləri istifadə edərək eyni nəticə əldə edə bilərsiniz:

 df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df], axis=1, inplace=True) 
20
14 февр. Aleksandr tərəfindən 14 Fevralda verilən cavab 2016-02-14 00:58 '16 'da 0:58' da 2016-02-14 00:58

Pandas 0. 21 + cavab

Pandas versiyası 0.21, renamereindex metodlarına görə indexcolumns parametrlərini bir az əlavə etmək üçün drop metodu dəyişdirmişdir.

 df.drop(columns=['column_a', 'column_c']) 

Şəxsən mən sütun və ya indeks göstərmək üçün axis parametrindən istifadə etməyi üstün edirəm, çünki demək olar ki, bütün panda metodlarında istifadə olunan sözün əsas parametri. Amma indi 0.21 versiyasında bir neçə əlavə variant var.

14
24 окт. Cavab Ted Petrou 24 oct verilir . 2017-10-24 17:31 '17 saat 17:31 'də 2017-10-24 17:31

Damla () istifadə etməlisiniz. Fayl sisteminizin adı df olduğunu varsayalım.

 #for dropping single column df = df.drop('your_column', axis=1) #for dropping multiple columns df = df.drop(['col_1','col_2','col_3'], axis=1) 
13
27 июля '17 в 20:48 2017-07-27 20:48 Cavab Nuru Akter Tövhidə 27 İyul 27 'də 20:48 2017-07-27 20:48' də verilir

Tl; DR

Bir az daha effektiv bir həll tapmaq üçün çox səy. df.drop(dlst, 1, errors='ignore') sadəlik qurban əlavə mürəkkəbliyi haqq qazandırmaq çətindir

 df.reindex_axis(np.setdiff1d(df.columns.values, dlst), 1) 

Başlanğıc
Bir sütunun silinməsi semantik olaraq digər sütunların seçimi ilə üst-üstə düşür. Hesab üçün bir neçə əlavə üsul göstərəcəyəm.

Eyni zamanda bir neçə sütunun silinməsi və mövcud olmayan sütunların silinməsinə imkan verən ümumi bir həllə diqqət yetirəcəyəm.

Bu həllərin istifadəsi ümumi və sadə bir iş üçün işləyəcək.


Özelleştirme
pd.DataFrame dfdlst silmək üçün bir siyahısını nəzərdən dlst

 df = pd.DataFrame(dict(zip('ABCDEFGHIJ', range(1, 11))), range(3)) dlst = list('HIJKLM') 

 df ABCDEFGHIJ 0 1 2 3 4 5 6 7 8 9 10 1 1 2 3 4 5 6 7 8 9 10 2 1 2 3 4 5 6 7 8 9 10 

 dlst ['H', 'I', 'J', 'K', 'L', 'M'] 

Nəticədə belə olmalıdır:

 df.drop(dlst, 1, errors='ignore') ABCDEFG 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 1 2 3 4 5 6 7 

Sütunun silinməsini digər sütunların seçiminə bərabər tutduğum üçün onu iki növə ayırıram:

  • Etiket seçimi
  • Məntiqi seçim

Etiket seçimi

Biz saxlamaq istədiyimiz sütunları təmsil edən və silmək istəməyən sütunlar olmadan bir siyahı / dizi yaradır.

  • df.columns.difference(dlst)

     Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object') 
  • np.setdiff1d(df.columns.values, dlst)

     array(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype=object) 
  • df.columns.drop(dlst, errors='ignore')

     Index(['A', 'B', 'C', 'D', 'E', 'F', 'G'], dtype='object') 
  • list(set(df.columns.values.tolist()).difference(dlst))

     # does not preserve order ['E', 'D', 'B', 'F', 'G', 'A', 'C'] 
  • [x for x in df.columns.values.tolist() if x not in dlst]

     ['A', 'B', 'C', 'D', 'E', 'F', 'G'] 

Bir yazı ilə sütunlar
Seçim prosesini müqayisə etmək üçün, güman et:

  cols = [x for x in df.columns.values.tolist() if x not in dlst] 

Sonra qiymətləndirə bilərik

  • df.loc[:, cols]
  • df[cols]
  • df.reindex(columns=cols)
  • df.reindex_axis(cols, 1)

Bütün bunlar tərəfindən qiymətləndirilənlər:

  ABCDEFG 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 1 2 3 4 5 6 7 

Boolean parçası

Dilimləmə üçün boolean elementlərin bir sıra / siyahısı yarada bilərik

  • ~df.columns.isin(dlst)
  • ~np.in1d(df.columns.values, dlst)
  • [x not in dlst for x in df.columns.values.tolist()]
  • (df.columns.values[:, None] != dlst).all(1)

Boolean Sütunlar
Müqayisə üçün

 bools = [x not in dlst for x in df.columns.values.tolist()] 
  • df.loc[: bools]

Bütün bunlar tərəfindən qiymətləndirilənlər:

  ABCDEFG 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 1 2 3 4 5 6 7 

Etibarlı vaxt

Funksiyalar

 setdiff1d = lambda df, dlst: np.setdiff1d(df.columns.values, dlst) difference = lambda df, dlst: df.columns.difference(dlst) columndrop = lambda df, dlst: df.columns.drop(dlst, errors='ignore') setdifflst = lambda df, dlst: list(set(df.columns.values.tolist()).difference(dlst)) comprehension = lambda df, dlst: [x for x in df.columns.values.tolist() if x not in dlst] loc = lambda df, cols: df.loc[:, cols] slc = lambda df, cols: df[cols] ridx = lambda df, cols: df.reindex(columns=cols) ridxa = lambda df, cols: df.reindex_axis(cols, 1) isin = lambda df, dlst: ~df.columns.isin(dlst) in1d = lambda df, dlst: ~np.in1d(df.columns.values, dlst) comp = lambda df, dlst: [x not in dlst for x in df.columns.values.tolist()] brod = lambda df, dlst: (df.columns.values[:, None] != dlst).all(1) 

Test

 res1 = pd.DataFrame( index=pd.MultiIndex.from_product([ 'loc slc ridx ridxa'.split(), 'setdiff1d difference columndrop setdifflst comprehension'.split(), ], names=['Select', 'Label']), columns=[10, 30, 100, 300, 1000], dtype=float ) res2 = pd.DataFrame( index=pd.MultiIndex.from_product([ 'loc'.split(), 'isin in1d comp brod'.split(), ], names=['Select', 'Label']), columns=[10, 30, 100, 300, 1000], dtype=float ) res = res1.append(res2).sort_index() dres = pd.Series(index=res.columns, name='drop') for j in res.columns: dlst = list(range(j)) cols = list(range(j // 2, j + j // 2)) d = pd.DataFrame(1, range(10), cols) dres.at[j] = timeit('d.drop(dlst, 1, errors="ignore")', 'from __main__ import d, dlst', number=100) for s, l in res.index: stmt = '{}(d, {}(d, dlst))'.format(s, l) setp = 'from __main__ import d, dlst, {}, {}'.format(s, l) res.at[(s, l), j] = timeit(stmt, setp, number=100) rs = res / dres 

 rs 10 30 100 300 1000 Select Label loc brod 0.747373 0.861979 0.891144 1.284235 3.872157 columndrop 1.193983 1.292843 1.396841 1.484429 1.335733 comp 0.802036 0.732326 1.149397 3.473283 25.565922 comprehension 1.463503 1.568395 1.866441 4.421639 26.552276 difference 1.413010 1.460863 1.587594 1.568571 1.569735 in1d 0.818502 0.844374 0.994093 1.042360 1.076255 isin 1.008874 0.879706 1.021712 1.001119 0.964327 setdiff1d 1.352828 1.274061 1.483380 1.459986 1.466575 setdifflst 1.233332 1.444521 1.714199 1.797241 1.876425 ridx columndrop 0.903013 0.832814 0.949234 0.976366 0.982888 comprehension 0.777445 0.827151 1.108028 3.473164 25.528879 difference 1.086859 1.081396 1.293132 1.173044 1.237613 setdiff1d 0.946009 0.873169 0.900185 0.908194 1.036124 setdifflst 0.732964 0.823218 0.819748 0.990315 1.050910 ridxa columndrop 0.835254 0.774701 0.907105 0.908006 0.932754 comprehension 0.697749 0.762556 1.215225 3.510226 25.041832 difference 1.055099 1.010208 1.122005 1.119575 1.383065 setdiff1d 0.760716 0.725386 0.849949 0.879425 0.946460 setdifflst 0.710008 0.668108 0.778060 0.871766 0.939537 slc columndrop 1.268191 1.521264 2.646687 1.919423 1.981091 comprehension 0.856893 0.870365 1.290730 3.564219 26.208937 difference 1.470095 1.747211 2.886581 2.254690 2.050536 setdiff1d 1.098427 1.133476 1.466029 2.045965 3.123452 setdifflst 0.833700 0.846652 1.013061 1.110352 1.287831 

 fig, axes = plt.subplots(2, 2, figsize=(8, 6), sharey=True) for i, (n, g) in enumerate([(n, g.xs(n)) for n, g in rs.groupby('Select')]): ax = axes[i // 2, i % 2] g.plot.bar(ax=ax, title=n) ax.legend_.remove() fig.tight_layout() 

Bu df.drop(dlst, 1, errors='ignore') çalıştırmak üçün lazım olan vaxt aiddir. Göründüyü kimi, bütün bu səylərdən sonra biz sadəcə performansını mütəmadi olaraq artırırıq.

2019

20 сент. Cavab 20 sentyabrdan etibarən verilir. 2017-09-20 08:43 '17 saat 08:43 'da 2017-09-20 08:43

Bir sütunu ( col_name ) məlumat çərçivəsindən ( df ) çıxarmaq istəyirsinizsə, aşağıdakılardan birini cəhd edin:

 df = df.drop(col_name, axis=1) 

Və ya eyni

 df.drop(col_name, axis=1, inplace=True) 

Sütun siyahısını ( col_lst = [col_name_1,col_name_2,...] ) data çərçivəsindən ( df ) col_lst = [col_name_1,col_name_2,...] aşağıdakılardan birini cəhd edin:

 df.drop(col_lst, axis=1, inplace=True) 

Və ya eyni

 df.drop(columns=col_lst, inplace=True) 
5
15 окт. Stephanie tərəfindən 15 oktyabrda verdiyi cavab 2018-10-15 19:51 '18 saat 07:51 'da 2018-10-15 19:51

Dot sözdizimi JavaScript-də işləyir, lakin Python-da deyil.

  • Python: del df['column_name']
  • Javascript: del df['column_name'] və ya del df.column_name
2
20 апр. Cavab doktoru tərəfindən verilir. 2016-04-20 18:55 '16 saat 6:55 'da 2016-04-20 18:55

Ayrıca əvvəlcə bütün sütun dəyərlərini NaN-ə təyin edə və sonra dropnanın ()

 df["column"]=np.NaN df.dropna(axis=1,inplace=True) 
1
25 окт. Cavab 2Obe 25 oct verilir . 2017-10-25 16:22 '17 saat 16:22 'da 2017-10-25 16:22

Pandas DataFrame-də bir sütunu silmək üçün bir yol

bir yerdə silmək istəmirsinizsə, DataFrame(...) istifadə edərək, sütunları göstərərək yeni bir DataFrame yarada bilərsiniz

 my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']} df = pd.DataFrame(my_dict) 

Kimi yeni bir DataFrame yaradın

 newdf = pd.DataFrame(df, columns=['name', 'age']) 

Del / düşmə nəticəsində eyni yaxşı nəticə əldə edirsiniz.

0
09 сент. Cavab sentyabrın 9-da Daksh tərəfindən verilir 2018-09-09 09:59 '18 saat 09:59 'da 2018-09-09 09:59