如何在Pandas中保留指定列并删除其余列后存入数据库?
Pandas 保留指定列并删除其余列的方法
我在Pandas中创建了一个DataFrame,里面包含一些不需要的列。想在存入数据库前仅保留所需列,删除其余列。是否可以通过指定列列表,删除DataFrame中不在列表内的列?
示例代码如下:
list_to_database = ['Name', 'Age', 'ZipCode', 'Email'..etc] response = req.get(url) json = response.json() dt = pd.json_normalize(json, sep='_') # 删除不在列表中的列这种需求很关键,因为不同数据的列数不同,API还会返回新增的自定义列。比如API返回的数据结构如下:
{ "user": 1, "name": "whatever", "Age": ...., "Zipcode": ..., "Email": ..., ... "customized": { "child1": "may or may not", "partner": "may or may not", }, "others": { "scholarity": .... } } { "user": 2, "name": "I don't know", "Age": ...., "Zipcode": ..., "Email": ..., ... "customized": { "partner": "may or may not", "parents": "may or may not", }, "others": { "scholarity": ...., "student": "Y/N" } }
方法1:直接筛选目标列(推荐)
最简洁高效的方式就是直接用目标列列表索引DataFrame,只保留需要的列。如果目标列表里有部分列在DataFrame中不存在,用intersection方法可以避免报错,自动只保留实际存在的目标列:
target_columns = ['Name', 'Age', 'ZipCode', 'Email'] # 找出DataFrame中存在的目标列 existing_target_cols = dt.columns.intersection(target_columns) # 筛选得到仅含目标列的新DataFrame dt_filtered = dt[existing_target_cols]
方法2:删除无关列
如果你需要明确删除不在目标列表里的列,可以先找出这些无关列,再用drop方法移除:
target_columns = ['Name', 'Age', 'ZipCode', 'Email'] # 生成需要删除的列列表 cols_to_drop = [col for col in dt.columns if col not in target_columns] # 删除无关列 dt_filtered = dt.drop(columns=cols_to_drop)
如果遇到API返回列名大小写不统一的情况(比如列表里是ZipCode,但返回的是Zipcode),可以先统一大小写再处理:
target_columns = ['Name', 'Age', 'ZipCode', 'Email'] # 把DataFrame的列名转成小写 dt.columns = dt.columns.str.lower() # 目标列表也转成小写 target_cols_lower = [col.lower() for col in target_columns] # 筛选列 existing_target_cols = dt.columns.intersection(target_cols_lower) dt_filtered = dt[existing_target_cols] # 可选:把列名改回目标格式 dt_filtered.columns = [col.title() for col in existing_target_cols]
方法3:用reindex指定列
reindex可以帮你按指定顺序排列列,同时自动丢弃不在目标列表里的列,搭配drop=True还会忽略不存在的目标列:
target_columns = ['Name', 'Age', 'ZipCode', 'Email'] dt_filtered = dt.reindex(columns=target_columns, drop=True)
内容的提问来源于stack exchange,提问作者Guaraci Falcão
相关产品推荐
相关产品推荐

