如何删除熊猫中的多列?

时间:2021-04-22 04:53:51

标签: python pandas list drop

如何在pandas和python中删除多列?

import pandas as pd

df =pd.DataFrame({
            "source_number":                        [ 
             [11199,11328,11287,32345,12342,1232,13456,123244,13456],
             "location":          
             ["loc2","loc1-loc3","loc3","loc1","loc2-loc1","loc2","loc3-loc2","loc2","loc1"],
              "category": 
             ["cat1","cat2","cat1","cat3","cat3","cat3","cat2","cat3","cat2"],
             })    

def remove_columns(dataset,cols):
    for col in cols:
        del dataset[col]
    return dataset

for col in df.columns:
    df=remove_columns(df,col)
df.head()    

在上面的代码中,任务完成并删除了列。

但是当 我在 streamlit 上尝试了这段代码,其中用户选择了他想从数据框中删除的多个列。

但问题是系统只取第一个元素,而不是列表中的所有项目。

就像如果用户选择位置源编号col变量将只包含位置并显示以下错误:

KeyError: 'location'
Traceback:
File "f:\aienv\lib\site-packages\streamlit\script_runner.py", line 333, in _run_script
    exec(code, module.__dict__)
File "F:\AIenv\streamlit\app.py", line 373, in <module>
    sidebars[y]=st.sidebar.multiselect('Filter '+y, df[y].unique(),key="1")
File "f:\aienv\lib\site-packages\pandas\core\frame.py", line 2902, in __getitem__
    indexer = self.columns.get_loc(key)
File "f:\aienv\lib\site-packages\pandas\core\indexes\base.py", line 2893, in get_loc
    raise KeyError(key) from err

流线型代码:

import numpy as np
import pandas as pd
import streamlit as st 

#function drop unwanted columns
def remove_columns(dataset,cols):
    for col in cols:
        del dataset[col]
    return dataset

df =pd.DataFrame({
          "source_number":                        [ 
           [11199,11328,11287,32345,12342,1232,13456,123244,13456],
           "location":          
           ["loc2","loc1-loc3","loc3","loc1","loc2-loc1","loc2","loc3-loc2","loc2","loc1"],
           "category": 
           ["cat1","cat2","cat1","cat3","cat3","cat3","cat2","cat3","cat2"],
           })    

drop_button = st.sidebar.button("Remove")
columns = st.sidebar.multiselect("Select  column/s", df.columns)
sidebars = {}
for y in columns:
    ucolumns=list(df[y].unique())   
    st.write(y)
    if (drop_button):
        df_drop=df.drop(y,axis=1,inplace=True)
        print(y)
    st.table(df)

2 个答案:

答案 0 :(得分:1)

使用DataFrame.drop

def remove_columns(dataset,cols):
    return dataset.drop(cols, axis=1)

对于没有循环的调用传递函数 - 可以传递标量或列表:

df = remove_columns(df,'location')

df = remove_columns(df,['location','category'])

编辑:

如果需要删除多选中选择的列,请使用:

drop_button = st.sidebar.button("Remove")

#in columns variable are selected values
columns = st.sidebar.multiselect("Select  column/s", df.columns)
print (columns)

#so if use button remove values by variable columns
if (drop_button):
    df.drop(columns,axis=1,inplace=True)

    st.table(df)
    

答案 1 :(得分:1)

Pandas 已经在函数 drop 中实现了这一点。 您可以像这样使用带有参数列 = [要删除的列] 的 pandas.drop :

df.drop(columns = ["source_number","location"]) 

希望这就是你要找的

相关问题