Python 对数据帧的dict进行迭代,以获得具有selectd列的数据帧的子集

Python 对数据帧的dict进行迭代,以获得具有selectd列的数据帧的子集,python,pandas,dictionary,Python,Pandas,Dictionary,我有多个数据帧(例如bellow只包含三个数据帧),我需要创建一个函数,该函数只选择我想保留的列 df1 = pd.DataFrame( { "column1": np.random.randint(100, 1000, 100), "column2": np.random.randint(200, 2000, 100), "column3": np.random.randint(

我有多个数据帧(例如bellow只包含三个数据帧),我需要创建一个函数,该函数只选择我想保留的列

df1 = pd.DataFrame(
    {
        "column1": np.random.randint(100, 1000, 100),
        "column2": np.random.randint(200, 2000, 100),
        "column3": np.random.randint(300, 3000, 100),
        "column4": np.random.randint(400, 4000, 100),
        "column5": np.random.randint(500, 5000, 100),
    }
)

df2 = pd.DataFrame(
    {
        "column1": np.random.randint(80, 800, 100),
        "column2": np.random.randint(50, 500, 100),
        "column3": np.random.randint(30, 300, 100),
        "column4": np.random.randint(10, 100, 100),
        "column5": np.random.randint(500, 5000, 100),
    }
)

df3 = pd.DataFrame(
    {
        "column1": np.random.randint(2, 20, 100),
        "column2": np.random.randint(80, 300, 100),
        "column3": np.random.randint(30, 500, 100),
        "column4": np.random.randint(60, 700, 100),
        "column5": np.random.randint(900, 3000, 100),
    }
)
为此,我必须使用以下格式的dict:

dict_of_dfs = {"df1": df1, "df2": df2, "df3": df3}
我必须创建一个函数来选择需要保留的列:

features = ["column3", "column4", "column5"]
它不是我需要删除的,而是要保留的(不是df=df.drop(columns='x','y','z')) 但是df=df[特征])

我试过这样的方法:

def select_columns(dict_of_dfs, features):
    for df in dict_of_dfs:
        df = df[features]
然后:

select_columns(dict_of_dfs, features)
但我总是得到错误“字符串索引必须是整数”


谁能给我解释一下为什么会这样?我很确定这是关于可变和不可变的,但我不懂python,我的逻辑不起作用的原因对我来说毫无意义。

因此,当你迭代
dict_of_dfs
时,它返回的是键而不是值(它们是
“df1”
“df2”
,…),因此你会得到错误。 在
select\u columns
中,您需要修改循环中的代码,以修改值(即数据帧)而不是键(字符串),这将使其正常工作:

def select_columns(dict_of_dfs, features):
    for df in dict_of_dfs:
        dict_of_dfs[df] = dict_of_dfs[df][features]

您可以使用
drop
inplace=True
来迭代dfs并删除不必要的列,而不必指定dfs和函数。通过这种方式,您必须使用
inplace=True
,这在
loc
中不可用,否则您可以选择要保留的列,而不是删除不需要的列:

features = ['column3', 'column4', 'column5']
dfs = (df1,df2,df3)

for df in dfs:
    df.drop([col for col in df.columns if col not in features], axis=1, inplace=True)

请单击我的答案旁边的复选标记,接受其中一个答案作为解决方案。非常感谢。