使用 pd.concat() 函数后的问题 - 编码 latin-1 - 德语字符

Posted

技术标签:

【中文标题】使用 pd.concat() 函数后的问题 - 编码 latin-1 - 德语字符【英文标题】:Problem after using the pd.concat() function - Encoding latin-1 - German Characters 【发布时间】:2019-09-24 23:48:06 【问题描述】:

我有一个包含 German Characters 的数据集。 当导入 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())

它给了 [“柏林”“科隆”“多特蒙德”“杜塞尔多夫”“法兰克福”“哈雷”“汉堡” “汉诺威” “海德堡” “英戈尔施塔特” “基尔” “曼海姆” “慕尼黑” '诺德施泰特' '雷根斯堡' '斯图加特']

合并后

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(['柏林', '科隆', '多特蒙德', 'D‚‚ƒÃƒÂƒÃ‚‚‚‚‚¼sseldorf', “法兰克福”、“哈勒”、“汉堡”、“汉诺威”、“海德堡”、 “英戈尔施塔特”、“基尔”、“曼海姆”、“慕尼黑”、“诺德施泰特”、 “雷根斯堡”、“斯图加特”、“奥格斯堡”、“比勒费尔德”、“波恩”、 “不来梅”、“开姆尼茨”、“达姆施塔特”、“德累斯顿”、“爱尔福特”、“埃森”、 'G‚‚‚ƒÃƒ‚ƒÃ‚‚‚‚‚‚‚¶ttingen', '莱比锡','美因茨',

我希望它是 [“柏林”“科隆”“多特蒙德”“杜塞尔多夫”“法兰克福”“哈雷”“汉堡” “汉诺威” “海德堡” “英戈尔施塔特” “基尔” “曼海姆” “慕尼黑” '诺德施泰特' '雷根斯堡' '斯图加特'] 我不想手动更改它们,我想要一个保留所有特殊字符的解决方案,因为还有其他列受到影响。

【问题讨论】:

无法使用 Python 3.6 和 pandas 0.23.4 进行复制。您应该显示您正在使用的版本。 我使用的是 Python 3.7.1 而 pd.__version__ 是 '0.23.4' 嗯,这些是最新版本。我怀疑glob.glob 返回了一个损坏的文件。 无论如何我可以连接 11 个文件并保留特殊字符吗? , UTF8 编码根本不起作用“'utf-8' 编解码器无法解码位置 8 的字节 0xfc:无效的起始字节”谢谢“ 【参考方案1】:

这不是一个直接的答案,但它可能有助于更好地识别问题并且它包含代码,因此它作为答案发布。

我的建议是尝试找出编码错误的名称的来源。假设您没有名为“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))

这应该会显示您从中获得编码错误的文件。

【讨论】:

【参考方案2】:

在类似的循环中连接 25 个大型 csv 文件时,我遇到了与 pd.concat() 相同的问题。在我的例子中,它们有西班牙文字符('ñ' 和 'ón')。正如 Serge 所暗示的那样,发生这种情况是因为您的某些 csv 或其中一部分不遵循您使用 pandas 的 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)

以下 sn-p 可能有助于识别每个文件的特定编码:

with open('D:\one.csv') as f:
   print(f)

或者,您可以找出哪个文件对 pd.read_csv 的“ISO-8859-1”(拉丁语)选项响应不佳,然后在 concat 之前单独更正它们。但是如果你有很多文件,这个选项可能是惩罚性的。

【讨论】:

以上是关于使用 pd.concat() 函数后的问题 - 编码 latin-1 - 德语字符的主要内容,如果未能解决你的问题,请参考以下文章

Pandas的拼接操作

`pd.concat` 与 `join=='inner'` 不会产生 pandas 数据帧的交集

Python数据分析库pandas ------ mergeconcatenation pd.concat合并与拼接

Pandas 的 concat 函数中的“级别”、“键”和名称参数是啥?

pd.concat() 和 pd.merge() 之间的区别以及为啥我会得到错误的输出?

pd.concat()与pd.merge()之间的区别,为什么我得到错误的输出?