[英]pandas dropping columns based on column name
全部
假設有一個帶有一些列名的 df - 在我的情況下,名稱是數值。 例如,名為 1000、1001 等的列。我需要刪除未通過特定過濾器測試的所有內容 - 在我的情況下,名稱小於特定值的所有列。 比方說不到1500...
我知道如何直接(通過列出每一列)或通過循環調用 drop 來執行此操作,但似乎效率很低。 我在表達它時遇到語法困難..
我試過這樣的事情:
df.drop(df.columns[x for x in df.columns.values<str(1500)], axis=1))
或者
df.drop(df.columns.values<str(1500)], axis=1)
但這些顯然是錯誤的。
請指教! 謝謝
我認為最簡單的是創建布爾掩碼,然后使用 loc 進行選擇:
df = pd.DataFrame(columns=range(10), index=[0]);
print (df)
0 1 2 3 4 5 6 7 8 9
0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
#inverting boolean mask with ~
print (df.loc[:, ~(df.columns < 8)])
8 9
0 NaN NaN
print (df.columns >= 8)
[False False False False False False False False True True]
print (df.loc[:, df.columns >= 8])
8 9
0 NaN NaN
與通過過濾的列名drop
相同的內容:
print (df.columns[df.columns < 8])
Int64Index([0, 1, 2, 3, 4, 5, 6, 7], dtype='int64')
print (df.drop(df.columns[df.columns < 8], axis=1))
8 9
0 NaN NaN
考慮一個列名從 0 到 99 的數據框。
0 1 2 3 4 5 6 7 8 9 ... 90 91 92 93 94 95 96 97 98 99
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
如果您想刪除小於 30 的列名,
df = df.drop((x for x in df.columns.tolist() if x < 30), axis = 1)
返回
30 31 32 33 34 35 36 37 38 39 ... 90 91 92 93 94 95 96 97 98 99
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
如果您的列是對象類型,請先使用
df.columns = df.columns.astype(np.int64)
首先構建要刪除的列列表(遍歷列,查看它們是否符合條件),然后立即刪除該列表中的所有列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.