如何将csv文件中的所有列更改为str?

时间:2019-09-20 17:55:30

标签: python pandas

我正在处理一个脚本,该脚本导入excel文件,遍历“标题”列,如果“标题”中存在某个关键字,则返回False。该脚本将运行,直到到达要导出另一个单独的csv文件的位置为止。我的错误如下:AttributeError: 'int' object has no attribute 'lower'

基于此错误,我使用df['Title'].astype(str)将df.Title更改为字符串,但出现相同的错误。

import pandas as pd

data = pd.read_excel(r'C:/Users/Downloads/61_MONDAY_PROCESS_9.16.19.xlsx')
df = pd.DataFrame(data, columns=['Date Added','Track Item', 'Retailer Item ID','UPC','Title','Manufacturer','Brand','Client Product 
Group','Category','Subcategory',
                           'Amazon Sub Category','Segment','Platform'])
df['Title'].astype(str)
df['Retailer Item ID'].astype(str)

excludes = ['chainsaw','pail','leaf blower','HYOUJIN','brush','dryer','genie','Genuine 
Joe','backpack','curling iron','dog','cat','wig','animal','dryer',':','tea', 'Adidas', 'Fila',
'Reebok','Puma','Nike','basket','extension','extensions','batteries','battery','[EXPLICIT]']

my_excludes = [set(x.lower().split()) for x in excludes]
match_titles = [e for e in df.Title.astype(str) if any(keywords.issubset(e.lower().split()) for 
keywords in my_excludes)]

def is_match(title, excludes = my_excludes):
    if any(keywords.issubset(title.lower().split()) for keywords in my_excludes):
        return True
    return False

这是返回错误的部分:

df['match_titles'] = df['Title'].apply(is_match)
result = df[df['match_titles']]['Retailer Item ID']
print(df)
df.to_csv('Asin_List(9.18.19).csv',index=False)

3 个答案:

答案 0 :(得分:2)

使用以下代码导入文件:

data = pd.read_excel(r'C:/Users/Downloads/61_MONDAY_PROCESS_9.16.19.xlsx',
                      dtype='str')`

答案 1 :(得分:0)

对于pandas.read_excel,您可以传递可选参数dtype。

您还可以使用它为不同的列传递多种数据类型:

例如:dtype={'Retailer Item ID': int, 'Title': str})

答案 2 :(得分:0)

在您写的那一行

match_titles = [e for e in df.Title.astype(str) if any(keywords.issubset(e.lower().split()) for 
keywords in my_excludes)]

python作为变量e返回一个整数而不是您喜欢的字符串。这是因为您在编写df.Title.astype(str)时正在搜索仅包含标题列而不包含列内容的新熊猫数据框的索引如果要遍历列,则应尝试

match_titles = [e for e in df.ix[:,5] if any(keywords.issubset(e.lower().split()) for keywords in my_excludes)

df.ix [:,5]返回数据帧df的第五列,即您想要的列。如果这样做不起作用,请尝试使用iteritems()函数。 主要思想是,如果直接将df [column]分配给其他对象,则是在分配其索引,而不是其内容。