簡體   English   中英

熊貓根據列名刪除列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM