我有一个包含德语字符的数据集。 导入11个编码为'ISO-8859-1'或'latin-1'的数据集时,德国城市名称的列很好,但是当使用具有相同编码的pd.concat()时,城市名称会更改。
encoding ='utf-8-sig'不起作用,并且
的输出import sys
print(sys.stdout.encoding)
是UTF-8
# Importing the dataset
skill1 = pd.read_csv('./SkillWizardCityAerospaceEngineering26april.csv',encoding='ISO-8859-1')
skill2 = pd.read_csv('./SkillWizardCityBeautyandCosmetics26april.csv',encoding='ISO-8859-1')
skill3 = pd.read_csv('./SkillWizardCityBusinessSuportFunction26april.csv',encoding='ISO-8859-1')
所有这些csv
print(skill1.CityName.unique())
它给 [“柏林”“科隆”“多特蒙德”“杜塞尔多夫”“法兰克福”“哈勒”“汉堡” “汉诺威”,“海德堡”,“因戈尔施塔特”,“基尔”,“曼海姆”,“慕尼黑” 'Norderstedt''Regensburg''斯图加特']
合并后
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
#combine all files in the list
combined_csv = pd.concat([pd.read_csv(f,encoding='ISO-8859-1') for f in all_filenames ],sort=True)
combined_csv.CityName.unique()
结果是: array(['Berlin','Cologne','Dortmund', 'DÃÃ,ƒƒÃƒÂ、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 “法兰克福”,“哈勒”,“汉堡”,“汉诺威”,“海德堡”, 'Ingolstadt','Kiel','Mannheim','Munich','Norderstedt', “雷根斯堡”,“斯图加特”,“奥格斯堡”,“比勒费尔德”,“波恩”, “不来梅”,“开姆尼茨”,“达姆施塔特”,“德累斯顿”,“爱尔福特”,“埃森”, 'GÃÃ,ƒÃÂ、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 '莱比锡','美因茨'
我希望是 [“柏林”“科隆”“多特蒙德”“杜塞尔多夫”“法兰克福”“哈勒”“汉堡” “汉诺威”,“海德堡”,“因戈尔施塔特”,“基尔”,“曼海姆”,“慕尼黑” 'Norderstedt''Regensburg''斯图加特'] 我不想手动更改它们,我想要一个保留所有特殊字符的解决方案,因为还有其他受影响的列。
答案 0 :(得分:0)
这不是直接答案,但可能有助于更好地识别问题,并且包含代码,因此将其发布为答案。
我的建议是尝试识别编码错误的名称的由来。假设您没有名为“ FILE_ORIGIN”的列,我将尝试以下操作:
def build_csv(file):
df = pd.read_csv(file,encoding='ISO-8859-1')
df['FILE_ORIGIN'] = file
return df
combined_csv = pd.concat([build_csv(f) for f in all_filenames ],sort=True)
combined_csv.loc[:,['CityName', 'FILE_ORIGIN']].groupby('CityName').agg(lambda x: ','.join(x))
这应该显示从中获取编码错误的文件。
答案 1 :(得分:0)
在类似的循环中连接25个大型csv文件时,我在pd.concat()中遇到了相同的问题。在我的情况下,他们有西班牙语字符(“ñ”和“ón”)。正如Serge所暗示的,发生这种情况是因为您的某些csv或其中的一部分不遵循您使用熊猫的read_csv编码选项(encoding ='ISO-8859-1')处理的相同编码。
这对我有用(我猜这不是一个快速而肮脏的解决方案):
在创建了“损坏的” concat之后,我使用Python的内置open函数打开了“ combined_csv”文件,并指定了以下选项(错误='backslashreplace'),如下所示:
file_name = open('D:\combined.csv', encoding='utf-8', errors = 'backslashreplace')
combined = pd.read_csv(file_name)
然后我将新的“合并的” csv文件保存为:
combined.to_csv(r"D:\combined.csv", encoding='utf-8', index=False)
以下代码段可能有助于识别每个文件的特定编码:
with open('D:\one.csv') as f:
print(f)
或者,您可以找出哪个文件对pd.read_csv的'ISO-8859-1'(拉丁)选项没有很好的响应,然后在连接之前逐个更正它们。但是,如果您有许多文件,则该选项可能会很惩罚。