python - 从不同大小的数据框中删除循环中的列
问题描述
我正在尝试从多个 xlsx 文件中连接一个时间列和另一个单列,删除其余的列。我的问题是,某些 xlsx 文件包含的列比其他文件多,并且在循环中运行它时,我得到一个“索引 4 超出轴 0 的范围,大小为 4”的 IndexError 消息。
我的代码非常复杂,因此我将所有代码都包含在内,以防万一。
导入模块
import pandas as pd
import numpy as np
定义变量
DIR = r'C:\Directory'+'\\'
FILE = "Filename.xlsx"
以下是我在目录 xlsx 文件中的读取方式
def get_df_from_xlsx(DIR,FILE):
DF= pd.read_excel(DIR+FILE, sheet_name='Sheet1')
return DF
DF=get_df_from_xlsx(DIR, FILE)
这个 excel 文件有一个名为“文件名”的列,其中包括我需要的 xlsx 文件的所有文件名(超过 300 个),它们位于同一目录中。
我使用下面的代码以及列表的长度创建了一个文件名列表
ALL_COL= get_df_from_xlsx(DIR, FILE)['Filename'].values[0:]
numfiles= len(ROW1)
这些中的每一个都只是一个文件名,我用它来创建一个 DF,我稍后会向其中添加值。
COL= get_df_from_xlsx(DIR, FILE)['Filename'].values[1]
COL2= get_df_from_xlsx(DIR, FILE)['Filename'].values[4]
在下面,我从列中打开一个 xlsx 文件 (COL),并将我要加入的列重命名为其他文件。我这样做了两次(def open_file(DIR,COL)和def open_file2(DIR,COL2)
def open_file(DIR, COL):
df1 = pd.read_excel(DIR+COL)
df1 = df1.rename(columns={'col_name':COL})
df1 = df1.drop(df1.columns[[1,3]], axis=1)
return df1
df1 =open_file(DIR, COL)
def open_file2(DIR, COL2):
df2 = pd.read_excel(DIR+COL2)
df2 = df2.rename(columns={'col_name':COL2})
df2 = df2.drop(df2.columns[[1,3]], axis=1)
return df2
df2 =open_file2(DIR, COL2)
concat 下面的代码将两个数据帧放在一起,按时间顺序保留所有数据,当原始文件中的一列没有那个时间时填充 NaN。
DF11 =pd.concat([s.set_index('Time') for s in [df1, df2]], axis=1).rename_axis('Time').reset_index()
然后删除除时间列之外的所有列。
DF11 = DF11.drop(DF11.columns[[1,2]], axis=1)
DF11
最后一步是这样,当我像这样运行它时,它的工作原理是所有原始 xlsx 文件都有第 1 列和第 3 列,但是有些有第 4 列和第 5 列。如果我尝试删除它们,我会收到错误消息。
for i in range(numfiles):
df=pd.read_excel(DIR+ALL_COL[i])
df=df.rename(columns={'col_name':ALL_COL[i]})
df=df.drop(df.columns[[1,3]], axis=1)
DF11=pd.concat([i.set_index('Time') for i in [df, DF11]], axis=1).rename_axis('Time').reset_index()
DF11
我尝试了这条线的多种变体,包括。
df=df.drop(df.columns[[1,3,4,5]], axis=1) #this does not work
使用如下两行代码
df=df.drop(df.columns[[1,3]], axis=1)
df=df.drop(columns=['four', 'five']) #with and without 'axis=1' and inplace=True
像这样:
df.drop(columns=['one', 'three', 'four', 'five'])#with and without 'axis=1' and inplace=True
都给了我同样的错误:索引 4 超出了轴 0 的范围,大小为 4'。
我将尝试展示 xlx 的外观以及它们的不同之处。
示例 1(更少的列)
Time, Dont need1, need 1, dont need 2
xxxx xxx xx xxxx
示例 2(另外 2 列)
Time, Dont need1, need 1, dont need 2, dont need 3, dont need 4
xxxx xxx xx xxxx xxxxx xxxx
请注意,xlsx 文件中的所有列名都是相同的(除非它们不存在)。
有没有办法删除第 4 列和第 5 列,如果它们不存在则忽略它们?谢谢
我在 python 3.7 上,使用 jupyter notebook。
解决方案
推荐阅读
- python - 具有损失评估的 Keras 网络在整个数据集上而不是在元素方面
- android - 任何人都知道是否有可以将鼠标移动转换为方向跟踪以玩纸板 vr 游戏的 Android 模拟器?
- google-sheets - 使用包含的分隔符导入文本值
- python-3.x - Python:将标准输出重定向到文件而不使用文件句柄
- sql - SQL server - 在链接服务器上查找重复项
- django - 使用内置的 django 用户模型远程创建用户
- pyspark - PySpark:如何从稀疏数组中提取值?
- reactjs - 如何在 ant design select 中输入“名称”html 属性?
- python-3.x - Pytest 检查错误返回的消息
- html - 如何在aem组件中设置背景图片,使用sightly