【问题标题】:How to fix AttributeError: 'int' object has no attribute 'strip' while loading excel file in pandas如何修复 AttributeError:在 pandas 中加载 excel 文件时“int”对象没有属性“strip”
【发布时间】:2021-04-27 10:56:49
【问题描述】:

我正在尝试在 pandas 中加载一个 excel 文件,但出现以下错误 -

AttributeError: 'int' 对象没有属性 'strip'

为了便于理解,我从 excel 中选取了下面一行以及标题 -

 Row ID Order ID    Order Date  Ship Date   Ship Mode   Customer ID Customer Name   Segment Country/Region  City    State   Postal Code Region  Product ID  Category    Sub-Category    Product Name    Sales   Quantity    Discount    Profit

    1   CA-2018-152156  08-11-2018  11-11-2018  Second Class    CG-12520    Claire Gute Consumer    United States   Henderson   Kentucky    42420   NorthEAST   FUR-BO-10001798 Finance Bookcases   Bush Somerset Collection Bookcase   261.96  2   0   41.9136

这是整个代码-

local_path= '../../data/RetailStore.xlsx'
out_path= '../../out/hyperstore.csv'

def load_retail_data(local_path,sheet_name):
    return pd.read_excel(
        local_path,
        header=4,
        sheet_name=sheet_name,
        parse_dates=True
    )

def clean_headers(data_frame:pd.DataFrame) -> pd.DataFrame:
    data_frame=data_frame.rename(columns=lambda x:x.strip())
    data_frame=data_frame.rename(columns=lambda x:x.replace('\n',' '))
    data_frame=data_frame.rename(columns=lambda x:x.replace("'",' '))
    data_frame=data_frame.rename(columns=lambda x:x.replace('  ',' '))
    return data_frame

def filter_ship_mode(df):
    return df[(df[ColumnsStore.ship_mode]!= 'Standard Class') & (df[ColumnsStore.ship_mode]!='Second Class')]


def calc_retail_data(local_path,sheet_name):
    retail_data=load_retail_data(local_path,sheet_name)
    retail_clean_headers=clean_headers(retail_data)
    retail_filtered=filter_ship_mode(retail_clean_headers)
    return retail_filtered


if __name__=="__main__":
    df_retail_data=calc_retail_data(local_path,'Orders')
    df_retail_data.to_csv(out_path,index=False)

【问题讨论】:

  • col_dict = dict(zip(df.columns.values,[str(col).strip().replace('\n',' ').replace("'",' ') .replace(' ',' ') for col in list(df.columns.values)])) -> 创建 col_dict 然后使用这个dict重命名列
  • 我应该在我的代码中哪里写这行?
  • 上面的可靠建议,基本上你的问题是clean_headers下的这一行:data_frame=data_frame.rename(columns=lambda x:x.strip()) -->你试图strip()x值是一个整数(例如迭代通过列号,而不是名称)
  • @Aelarion 那么正确的做法是什么?

标签: python python-3.x pandas dataframe


【解决方案1】:

您可以将列标题类型转换为字符串

def clean_headers(data_frame:pd.DataFrame) -> pd.DataFrame:
    df.columns = df.columns.astype(str)
    data_frame=data_frame.rename(columns=lambda x:x.strip())
    ...

或者只是转义int类型

def clean_headers(data_frame:pd.DataFrame) -> pd.DataFrame:
    df.columns = df.columns.astype(str)
    data_frame=data_frame.rename(columns=lambda x: x.strip() if isinstance(x, str) else x)
    # do the same thing with other header cleaning function.
    ...

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 2020-03-25
    • 2016-08-11
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2013-07-19
    • 2013-07-18
    • 2020-08-06
    相关资源
    最近更新 更多