首页 > 解决方案 > 从不同大小的数据框中删除循环中的列

问题描述

我正在尝试从多个 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。

标签: pythonpython-3.xpandasnumpy

解决方案


推荐阅读