පැන්ඩා ඩේටා ෆ්‍රේම් වෙතින් තීරුව මකන්න


1398

මම භාවිතා කරන දත්ත රාමුවක තීරුවක් මකා දැමීමේදී:

del df['column_name']

මෙය විශිෂ්ටයි. මට පහත සඳහන් දෑ භාවිතා කළ නොහැක්කේ ඇයි?

del df.column_name

තීරුව / ශ්‍රේණියට ප්‍රවේශ විය හැකි බැවින්, මෙය ක්‍රියාත්මක df.column_nameවනු ඇතැයි මම අපේක්ෂා කළෙමි.


2
මෙම ප්‍රශ්නය මෙටා හි සාකච්ඡා කෙරෙමින් පවතින බව සලකන්න .
ආර්එම්

1
මේ සඳහා තවත් එක් උඩුකය අවශ්‍යයි
DBless

Answers:


924

ඔබ අනුමාන කළ පරිදි, නිවැරදි වාක්‍ය ඛණ්ඩය වේ

del df['column_name']

del df.column_nameපයිතන් හි සින්ටැක්ටික් සීමාවන් නිසා සරලව වැඩ කිරීම දුෂ්කර ය . ආවරණ යටට පයිතන් del df[name]පරිවර්තනය df.__delitem__(name)කරයි.


26
මම මේ සුපිරි පරණ "පිළිතුර" තේරුම්, නමුත් ඒ ගැන මගේ කුතුහලය තරහෙන් ඇත - ඇයි Python ක සින්ටැක්ටික් සීමාවක් ඒ? class A(object): def __init__(self): self.var = 1පංතියක් සකසයි, පසුව a = A(); del a.varහොඳින් ක්‍රියා කරයි ...
ඩ්වාන්ඩර්සන්

14
wdwanderson වෙනස වන්නේ තීරුවක් ඉවත් කිරීමට අවශ්‍ය විට, "එය කරන්නේ කෙසේද" යන්න සඳහා දත්ත රාමුවට තමන්ගේම හැසිරවීමක් තිබිය යුතුය. පිළිබඳ පැමිණිල්ලේ දී del df[name], ඒ සඳහා පරිවර්තනය වී යයි df.__delitem__(name)DataFrame ක්රියාත්මක සහ එහි අවශ්යතා වෙනස් කළ හැකි ක්රමයක් වන. පිළිබඳ පැමිණිල්ලේ දී del df.name, සාමාජික විචල්ය ඕනෑම අභිරුචි-කේතය ධාවන සඳහා අවස්ථාවක් තොරව ඉවත් කරයි. ඔබේම උදාහරණය සලකා බලන්න - del a.var"මකා දැමීමේ විචල්‍යය" මුද්‍රණය කිරීමට ඔබට හැකිද? ඔබට හැකි නම්, කරුණාකර මට කියන්න. මට බැහැ :)
යොනාටන්

8
On යොනාටන් ඔබට docs.python.org/3/reference/datamodel.html#object.__delattr__ හෝ ඒ සඳහා විස්තර කරන්නන් භාවිතා කළ හැකිය : docs.python.org/3/howto/descriptor.html
ඉයුජින්

5
On යොනාටන් ඉයුජින්ගේ ප්‍රකාශය පයිතන් 2 සඳහා ද අදාළ වේ; විස්තර කරන්නන් 2.2 සිට පයිතන් 2 හි සිට ඇති අතර ඔබේ අවශ්‍යතාවය සපුරාලීම සුළුපටු ය;)
CS

1
මෙම පිළිතුර ඇත්ත වශයෙන්ම නිවැරදි නැත - pandasසංවර්ධකයින් එසේ නොකළ නමුත් එයින් අදහස් කරන්නේ එය කිරීමට අපහසු බවය.
wizzwizz4

2272

පැන්ඩා වල මෙය කිරීමට හොඳම ක්‍රමය භාවිතා කිරීම drop:

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

එහිදී 1තමයි අක්ෂය අංකය ( 0පේළි හා 1තීරු සඳහා.)

නැවත පැවරීමකින් තොරව තීරුව මකා දැමීමට dfඔබට කළ හැක්කේ:

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

අවසාන වශයෙන්, තීරු ලේබලය වෙනුවට තීරු අංකයෙන් වැටීමට , මකා දැමීමට මෙය උත්සාහ කරන්න, උදා: 1, 2 සහ 4 තීරු:

df = df.drop(df.columns[[0, 1, 3]], axis=1)  # df.columns is zero-based pd.Index 

තීරු සඳහා "පෙළ" සින්ටැක්ස් සමඟ වැඩ කිරීම:

df.drop(['column_nameA', 'column_nameB'], axis=1, inplace=True)

සටහන: v0.21.0 (2017 ඔක්තෝබර් 27) හි හඳුන්වා දී ඇති , බිංදු () ක්‍රමය අක්ෂය නියම කිරීමට විකල්පයක් ලෙස දර්ශක / තීරු මූල පද පිළිගනී.

එබැවින් අපට දැන් කළ හැක්කේ:

df.drop(columns=['B', 'C'])


87
delකිසියම් හේතුවක් නිසා මෙය නිර්දේශ කර තිබේද?
beardc

21
මෙම මකාදැමීමේ ක්‍රමයට එහි ගුණාංග තිබුණද, මෙම පිළිතුර අසන ප්‍රශ්නයට සැබවින්ම පිළිතුරු සපයන්නේ නැත.
පෝල්

115
ඇත්ත a පෝල්, නමුත් ප්‍රශ්නයේ මාතෘකාව නිසා, මෙහි පැමිණෙන බොහෝ අය එසේ කරන්නේ තීරුවක් මකා දැමිය යුතු ආකාරය සොයා බැලීමට ය.
ලන්ඩන් රොබ්

27
@beardc තවත් වාසියක් dropකට delබව ය dropඔබ මෙහෙයුම inplace හෝ නැති කිරීම, එකවර බහු තීරු ඉවත් කිරීමට ඉඩ ලබා දෙන අතර, ද (3-D න්යාසය සඳහා ඉතා ප්රයෝජනවත් හෝ අක්ෂය ඔස්සේ delete වාර්තා Panel)
ෙහොබ්ස්

10
dropඕවර් හි තවත් වාසියක් delනම්, බින්දුව පැන්ඩාස් ඒපීඅයි හි කොටසක් වන අතර එහි ලේඛන අඩංගු වේ.
මොඩියුලිටෝස්

245

භාවිත:

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

මෙය තැනින් තැන තීරු එකක් හෝ කිහිපයක් මකා දමනු ඇත. බව සටහන inplace=Truepandas v0.13 එකතු සහ පැරණි අනුවාද මත වැඩ නොකරන ලදී. එවැනි අවස්ථාවකදී ඔබට ප්‍රති result ලය නැවත ලබා දිය යුතුය:

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

3
මෙම පිළිතුර පිළිබඳ සටහනක්: 'ලැයිස්තුවක්' භාවිතා කරන්නේ නම්, වර්ග වරහන් අතහැර දැමිය යුතුය:df.drop(list,inplace=True,axis=1)
edesz

1
මෙය සැබවින්ම පිළිගත් පිළිතුර විය යුතුය, මන්දයත් මෙම ක්‍රමයේ ඇති විශිෂ්ටත්වය පැහැදිලි කරන බැවිනි del- එකවර තීරු එකකට වඩා පහත දැමිය හැකිය.
dbliss

මම විශ්වාස කරන්නේ ඔබ ක්වාර්ග් තීරු භාවිතා කරන්නේ නම්, උදා df.drop(columns=['A', 'B']), එවිට ඔබට නියම කළ යුතු නැත axis=1.
බිලියම්

117

දර්ශකය අනුව අතහරින්න

පළමු, දෙවන සහ සිව්වන තීරු මකන්න:

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

පළමු තීරුව මකන්න:

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

inplaceපිටපතක් නිර්මාණය නොකර මුල් දත්ත වෙනස් කළ හැකි වන පරිදි විකල්ප පරාමිතියක් ඇත.

පොප්

තීරු තේරීම, එකතු කිරීම, මකා දැමීම

තීරුව මකන්න column-name:

df.pop('column-name')

උදාහරණ:

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

1
පැන්ඩා වල පේළියක් පොප් කරන්නේ කෙසේද?
කෙනට් සෙලෙස්ටෙ

2
Uy යුගි ඒ සඳහා ඔබට පාරදෘශ්‍ය දත්ත රාමුවක් භාවිතා කළ හැකිය. ex - df.T.pop('A')
ඔරලෝසු වහල්

LockClockSlave එය මුල් පිටපත වෙනස් නොකරයි df. ඔබ විය හැකි දෙයක් df = df.T; df.pop(index); df = df.Tනමුත් මෙම අධික බව පෙනේ.
cs95

ඒ වෙනුවට df.drop(df.columns[[0]], axis=1, inplace=True)එය භාවිතා කිරීම ප්‍රමාණවත් df.drop([0], axis=1)නොවේද?
අනිර්බන් මුකර්ජි

1
N අනිර්බන් මුකර්ජි එය රඳා පවතී. Delete තීරුව නම අවශ්ය නම් 0, එසේ නම් df.drop(0, axis=1)හොඳින් වැඩ. නමුත් තීරුවේ නම නොදන්නේ නම් සහ පළමු තීරුව ඉවත් කිරීමට අවශ්‍ය නම් df.drop(df.columns[[0]], axis=1, inplace=True), එය පළමු තීරුව පිහිටීම අනුව තෝරා එය අතහරින්න.
jezrael

73

මෙහි ඇති බොහෝ පිළිතුරු මග හැරුණු සත්‍ය ප්‍රශ්නය:

මට භාවිතා කළ නොහැක්කේ ඇයි del df.column_name?

මුලදී අප ගැටලුව තේරුම් ගත යුතු අතර, එමඟින් අපට පයිතන් මැජික් ක්‍රමවලට කිමිදිය යුතුය .

වෙස් සිය පිළිතුරෙහි පෙන්වා ඇති පරිදි තීරුව අතහැර දැමීම සඳහා පැන්ඩා වල ක්‍රියාත්මක වනdel df['column'] පයිතන් මැජික් ක්‍රමයට සිතියම් ගත කරයිdf.__delitem__('column')

කෙසේ වෙතත්, පයිතන් මැජික් ක්‍රම ගැන ඉහත සබැඳියේ පෙන්වා ඇති පරිදි :

ඇත්ත වශයෙන්ම, __del__එය හැඳින්වෙන අස්ථිර තත්වයන් නිසා කිසි විටෙකත් භාවිතා නොකළ යුතුය; එය ප්‍රවේශමෙන් භාවිතා කරන්න!

del df['column_name']එය භාවිතා කළ යුතු හෝ ධෛර්යමත් නොකළ යුතු යැයි ඔබට තර්ක කළ හැකි අතර, එමඟින් del df.column_nameසලකා බැලිය යුතු නොවේ.

කෙසේ වෙතත්, න්යාය, del df.column_nameභාවිතා pandas වැඩ කිරීමට implemeted කළ හැකි මැජික් ක්රමය__delattr__ . කෙසේ වෙතත් මෙය යම් යම් ගැටළු හඳුන්වා දෙයි, del df['column_name']ක්‍රියාත්මක කිරීම දැනටමත් ඇති ගැටළු , නමුත් අඩු මට්ටමක.

උදාහරණ ගැටලුව

දත්ත රාමුවක "dtypes" හෝ "තීරු" යනුවෙන් මම තීරුවක් අර්ථ දැක්වුවහොත් කුමක් කළ යුතුද?

එවිට මට මෙම තීරු මකා දැමීමට අවශ්‍ය යැයි උපකල්පනය කරන්න.

del df.dtypes__delattr__එය "dtypes" ගුණාංගය හෝ "dtypes" තීරුව මකා දැමිය යුතුය යන ක්‍රමය ව්‍යාකූල කරයි.

මෙම ගැටළුව පිටුපස වාස්තු විද්‍යාත්මක ප්‍රශ්න

  1. දත්ත රාමුවක් තීරු එකතුවක්ද ?
  2. දත්ත රාමුවක් පේළි එකතුවක්ද ?
  3. තීරු යනු විශේෂණය වූ dataframe කවෙර්ද;

පණ්ඩස් පිළිතුරු දෙයි:

  1. ඔව්, සෑම ආකාරයකින්ම
  2. නැහැ, එහෙත් ඔබ එය කිරීමට අවශ්ය නම්, ඔබ භාවිතා කළ හැකිය .ix, .locහෝ .ilocක්රම.
  3. සමහර විට, ඔබට දත්ත කියවීමට අවශ්‍යද ? එවිට ඔව් , මිස ආරෝපණය නම මේ වන විටත් dataframe අයත් තවත් විශේෂණය විසින් ගනු ඇත. ඔබට දත්ත වෙනස් කිරීමට අවශ්‍යද ? එහෙනම් නැහැ .

ටීඑල්ඩීආර්;

ඔබට එය කළ නොහැක්කේ del df.column_nameපැන්ඩාහි තරමක් වල් වැඩුණු ගෘහ නිර්මාණ ශිල්පයක් ඇති බැවින් එහි පරිශීලකයින්ට මෙවැනි සංජානන විසංවාදයක් ඇති නොවීමට නැවත සලකා බැලිය යුතුය .

ආරක්ෂා කරන්න:

Df.column_name භාවිතා නොකරන්න, එය ලස්සන විය හැකි නමුත් එය සංජානන විසංවාදයට හේතු වේ

මෙහි ගැලපෙන සෙන් ඔෆ් පයිතන් උපුටා දැක්වීම්:

තීරුවක් මකා දැමීමට විවිධ ක්‍රම තිබේ.

එකක් තිබිය යුතුය - වඩාත් සුදුසු වන්නේ එය කිරීමට එක් - පැහැදිලි ක්‍රමයක් පමණි.

තීරු සමහර විට ගුණාංග වන නමුත් සමහර විට එසේ නොවේ.

විශේෂ අවස්ථා නීති කඩ කිරීමට තරම් විශේෂ නොවේ.

ඇත්තාට del df.dtypesඇති dtypes විශේෂණය හෝ dtypes තීරුව මකා?

අපැහැදිලි තත්වයන් හමුවේ, අනුමාන කිරීමට ඇති පෙළඹවීම ප්‍රතික්ෂේප කරන්න.


"ඇත්ත වශයෙන්ම, __del__එය හැඳින්වෙන අස්ථිර තත්වයන් නිසා කිසි විටෙකත් පාහේ භාවිතා නොකළ යුතුය; එය ප්‍රවේශමෙන් භාවිතා කරන්න!" මෙහි භාවිතා වන ක්‍රමය මෙන් මෙහි සම්පූර්ණයෙන්ම අදාල නොවේ __delattr__.
pppery

1
@ppperry ඔබට මිස්-කෝට් කිරීම. එය delබිල්ඩින් යනු අදහස් කරන .__del__ක්‍රමය මිස නිදර්ශන ක්‍රමය නොවේ. මෙම delbuiltin කිරීමට සිතියම් ඇත __delattr__හා __delitem__වන මම මගේ තර්කය ගොඩ සිටින්නේ. ඉතින් සමහර විට ඔබට මා ලියූ දේ නැවත කියවීමට අවශ්‍ය වනු ඇත.
firelynx

1
__... __StackExchange විසින් නිර්භීත සලකුණු කිරීමක් ලෙස අර්ථකථනය කරයි
pppery

2
"Df.column_name භාවිතා නොකරන්න, එය ලස්සන විය හැකි නමුත් එය සංජානන විසංවාදයට හේතු වේ" මෙයින් අදහස් කරන්නේ කුමක්ද? මම මනෝ විද්‍යා ologist යෙක් නොවේ, එබැවින් ඔබ අදහස් කරන දේ තේරුම් ගැනීමට මට මෙය සොයා බැලිය යුතුය. පැන්ඩා වල එකම දේ කිරීමට වලංගු ක්‍රම සිය ගණනක් ඇති බැවින් ද සෙන් උපුටා දැක්වීම අර්ථ විරහිත ය.
cs95

62

කදිම එකතු කිරීමක් නම් තීරු අතහැර දැමීමේ හැකියාව පවතින්නේ නම් පමණි . මේ ආකාරයෙන් ඔබට වැඩිපුර භාවිත අවස්ථා ආවරණය කළ හැකි අතර, එමඟින් එය ලබා දී ඇති ලේබල වලින් දැනට පවතින තීරු පමණක් පහත වැටෙනු ඇත:

දෝෂ එකතු කරන්න = උදාහරණයක් ලෙස නොසලකා හරින්න :.

df.drop(['col_name_1', 'col_name_2', ..., 'col_name_N'], inplace=True, axis=1, errors='ignore')
  • පැන්ඩා 0.16.1 සිට මෙය අලුත් ය. ප්‍රලේඛනය මෙහි ඇත.

43

0.16.1 අනුවාදයෙන් ඔබට කළ හැකිය

df.drop(['column_name'], axis = 1, inplace = True, errors = 'ignore')

3
එවැනි යෙදුමක් අවශ්‍ය නම් ඒවායින් සමහරක් නොපවතින (එනම් දෝෂයක් මතු නොකර errors= 'ignore') df.drop(['column_1','column_2'], axis=1 , inplace=True,errors= 'ignore')අවශ්‍ය වේ.
muon

32

සෑම විටම []අංකනය භාවිතා කිරීම හොඳ පුරුද්දකි . එක් හේතුවක් නම් df.column_nameඅංකිත දර්ශක සඳහා ආරෝපණ අංකනය ( ) ක්‍රියා නොකිරීමයි:

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

28

පණ්ඩස් 0.21+ පිළිතුර

පැන්ඩාස් අනුවාදය 0.21 මඟින් dropක්‍රමවේදය තරමක් වෙනස් කර ඇති indexඅතර columnsපරාමිතීන් දෙකම ඇතුළත් කර අත්සන renameහා reindexක්‍රමවේදයන්ට ගැලපේ .

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

පුද්ගලිකව, මම axisතීරු හෝ දර්ශකය දැක්වීමට පරාමිතිය භාවිතා කිරීමට කැමැත්තෙමි, මන්ද එය සෑම පැන්ඩා ක්‍රමයකම පාහේ භාවිතා වන ප්‍රධාන වචන පද පරාමිතිය වේ. නමුත්, දැන් ඔබට 0.21 අනුවාදයේ අමතර තේරීම් කිහිපයක් තිබේ.


1
df.drop (['column_a', 'column_c'], අක්ෂය = 1) | එය දැනට මා වෙනුවෙන් වැඩ කරයි
YouAreAwesome

22

පැන්ඩා 0.16.1+ හි ඔබට තීරු අතහැර දැමිය හැක්කේ @eiTanLaVi විසින් පළ කරන ලද විසඳුමකට අනුව නම් පමණි. එම අනුවාදයට පෙර, ඔබට කොන්දේසි සහිත ලැයිස්තු අවබෝධයක් හරහා එකම ප්‍රති result ලය ලබා ගත හැකිය:

df.drop([col for col in ['col_name_1','col_name_2',...,'col_name_N'] if col in df], 
        axis=1, inplace=True)

15

ටීඑල්; ඩී.ආර්

ආන්තිකව වඩා කාර්යක්ෂම විසඳුමක් සෙවීම සඳහා විශාල උත්සාහයක්. හි සරල බව පරිත්‍යාග කරන අතරම එකතු කළ සංකීර්ණතාව සාධාරණීකරණය කිරීමට අපහසුයdf.drop(dlst, 1, errors='ignore')

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

පෙරවදන
තීරුවක් මකා දැමීම අනෙක් තීරු තේරීමට සමාන වේ. සලකා බැලීමට අමතර ක්‍රම කිහිපයක් මම පෙන්වන්නම්.

එකවර තීරු කිහිපයක් මකා දැමීමේ සහ නොපවතින තීරු මකාදැමීමේ උත්සාහයට ඉඩ දීමේ පොදු විසඳුම කෙරෙහි ද මම අවධානය යොමු කරමි.

මෙම විසඳුම් භාවිතා කිරීම සාමාන්‍ය දෙයක් වන අතර සරල අවස්ථාව සඳහාද ක්‍රියා කරනු ඇත.


සැකසුම මකා දැමීමට සහ ලැයිස්තුව
සලකා බලන්නpd.DataFrame dfdlst

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

df

   A  B  C  D  E  F  G  H  I   J
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']

ප්‍රති result ලය මෙසේ විය යුතුය:

df.drop(dlst, 1, errors='ignore')

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

තීරුවක් මකා දැමීම අනෙක් තීරු තේරීමට සමාන බැවින් මම එය වර්ග දෙකකට වෙන් කරමි:

  1. ලේබල් තේරීම
  2. බූලියන් තේරීම

ලේබල් තේරීම

අපි ආරම්භ කරන්නේ අපට තබා ගැනීමට අවශ්‍ය තීරු සහ අපට මැකීමට අවශ්‍ය තීරු නොමැතිව ලේබල් ලැයිස්තුව / පෙළ සකස් කිරීමෙනි.

  1. df.columns.difference(dlst)

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

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

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

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

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

ලේබල වලින් තීරු
තේරීමේ ක්‍රියාවලිය සංසන්දනය කිරීම සඳහා, උපකල්පනය කරන්න:

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

එවිට අපට ඇගයීමට ලක් කළ හැකිය

  1. df.loc[:, cols]
  2. df[cols]
  3. df.reindex(columns=cols)
  4. df.reindex_axis(cols, 1)

සියල්ලන්ටම ඇගයීමට ලක් කරන්නේ:

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

බූලියන් පෙත්ත

පෙති කැපීම සඳහා අපට බූලියන් පෙළක් / ලැයිස්තුවක් සෑදිය හැකිය

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


සංසන්දනය කිරීම සඳහා බූලියන් වෙතින් තීරු

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

සියල්ලන්ටම ඇගයීමට ලක් කරන්නේ:

   A  B  C  D  E  F  G
0  1  2  3  4  5  6  7
1  1  2  3  4  5  6  7
2  1  2  3  4  5  6  7

ශක්තිමත් වේලාව

කාර්යයන්

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)

පරීක්ෂා කිරීම

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()

මෙය ක්‍රියාත්මක වීමට ගතවන කාලයට සාපේක්ෂව වේ df.drop(dlst, 1, errors='ignore'). ඒ සියලු උත්සාහයන්ගෙන් පසුව, අපි කාර්ය සාධනය නිහතමානීව පමණක් වැඩි දියුණු කරන බවක් පෙනේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඇත්ත වශයෙන්ම හොඳම විසඳුම් භාවිතා කරන්නේ නම් reindexහෝ reindex_axisහැක් කිරීම list(set(df.columns.values.tolist()).difference(dlst)). ඒ සමීප දෙවන හා තවමත් ඉතා සුළු ට වඩා යහපත් dropකියන්නේ np.setdiff1d.

rs.idxmin().pipe(
    lambda x: pd.DataFrame(
        dict(idx=x.values, val=rs.lookup(x.values, x.index)),
        x.index
    )
)

                      idx       val
10     (ridx, setdifflst)  0.653431
30    (ridxa, setdifflst)  0.746143
100   (ridxa, setdifflst)  0.816207
300    (ridx, setdifflst)  0.780157
1000  (ridxa, setdifflst)  0.861622

9

අපි හැකි ඉවත් කරන්න හෝ ඉවත් කරන්න නිශ්චිත තීරුවක් හෝ විසින් තීරු sprcified පහත () ක්රමය.

Df යනු දත්ත රාමුවක් යැයි සිතමු .

ඉවත් කළ යුතු තීරුව = තීරුව 0

කේතය:

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

බහු තීරු ඉවත් කිරීමට col1, col2 ,. . . , coln, ඉවත් කිරීමට අවශ්‍ය සියලුම තීරු ලැයිස්තුවකට ඇතුළත් කළ යුතුය. ඉන්පසු ඒවා බිංදු () ක්‍රමයෙන් ඉවත් කරන්න.

කේතය:

df = df.drop([col1, col2, . . . , coln], axis=1)

එය ප්‍රයෝජනවත් වනු ඇතැයි මම බලාපොරොත්තු වෙමි.


df = df.drop([col1, col2, . . . , coln], axis=1)මම col1, col2 ආදිය වෙනුවට විචල්‍ය නාමයක් සඳහන් කළහොත් මෙය ක්‍රියා නොකරයි. දෝෂ තීරුව ලැබෙන්නේ අක්ෂයේ නොව නියත වශයෙන්ම පවතින විටය. It ලිටින් ඔබට උදව් කළ හැකිද?
ආර්එස්එම්

5

ඔබගේ මුල් දත්ත රාමුව dfඉතා විශාල නොවේ නම්, ඔබට මතක සීමාවන් නොමැත, ඔබට අවශ්‍ය වන්නේ තීරු කිහිපයක් පමණි, නැතහොත්, ඔබට අවශ්‍ය නොවන අමතර තීරු සියල්ලේ නම් ඔබ කලින් නොදන්නේ නම්, එවිට ඔබට ඔබට අවශ්‍ය තීරු පමණක් සහිත නව දත්ත රාමුවක් සාදන්න:

new_df = df[['spam', 'sausage']]

3

තිත් සින්ටැක්ස් ජාවාස්ක්‍රිප්ට් හි ක්‍රියා කරයි, නමුත් පයිතන්හි නොවේ.

  • පයිතන්: del df['column_name']
  • JavaScript: del df['column_name'] හෝ del df.column_name

2

පැන්ඩාස් දත්ත රාමුවේ තීරුවක් මකා දැමීමේ තවත් ක්‍රමයක්

ඔබ ස්ථානීය මකාදැමීමක් සොයන්නේ නැත්නම්, DataFrame(...)ශ්‍රිතය භාවිතා කරමින් තීරු නියම කිරීමෙන් ඔබට නව දත්ත රාමුවක් නිර්මාණය කළ හැකිය

my_dict = { 'name' : ['a','b','c','d'], 'age' : [10,20,25,22], 'designation' : ['CEO', 'VP', 'MD', 'CEO']}

df = pd.DataFrame(my_dict)

ලෙස නව දත්ත රාමුවක් සාදන්න

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

ඔබට ඩෙල් / ඩ්‍රොප් සමඟ ලැබෙන දේ තරම් හොඳ ප්‍රති result ලයක් ලැබේ


1
මෙය තාක්‍ෂණිකව නිවැරදි නමුත් ඔබට මකා දැමීමට අවශ්‍ය තීරු එකක් (හෝ කිහිපයක්) වෙනුවට තබා ගැනීමට සෑම තීරුවක්ම ලැයිස්තුගත කිරීම මෝඩකමක් ලෙස පෙනේ.
cs95
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.