Python 对数据帧的dict进行迭代,以获得具有selectd列的数据帧的子集
我有多个数据帧(例如bellow只包含三个数据帧),我需要创建一个函数,该函数只选择我想保留的列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(
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)
请单击我的答案旁边的复选标记,接受其中一个答案作为解决方案。非常感谢。