- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 pandas 打开德语 csv 文件的最佳方式是什么?
我有一个包含以下列的德语 csv 文件:
我的预期输出是:
Umlaute Zahlen
Datum
2020-01-01 Rüdiger 1000000.11
2020-01-02 Günther 12.34
2020-01-03 Jürgen 567.89
下面提供了示例数据(请参阅文件)。
df = pd.read_csv('german_csv_test.csv')
这会引发UnicodeDecodeError
:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 12: invalid start byte
df = pd.read_csv('german_csv_test.csv', sep=';', encoding='latin1')
这不会引发错误,但它离我想要的输出还很远:
Datum Umlaute Zahlen
0 01.01.2020 Rüdiger 1.000.000,11
1 02.01.2020 Günther 12,34
2 03.01.2020 Jürgen 567,89
df = pd.read_csv('german_csv_test.csv', sep=';', encoding='latin1')
df['Datum'] = pd.to_datetime(df['Datum'])
df = df.set_index('Datum')
df['Zahlen'] = pd.to_numeric(df['Zahlen'])
现在,我有四行代码,但它仍然不起作用。最后一行抛出错误 ValueError: Unable to parse string "1.000.000,11 "at position 0
。如果我注释掉最后一行,它就会起作用。但日期仍然是错误的,因为日期和月份互换了。
Umlaute Zahlen
Datum
2020-01-01 Rüdiger 1.000.000,11
2020-02-01 Günther 12,34
2020-03-01 Jürgen 567,89
我的文件 german_csv_test.csv
如下所示:
Datum;Umlaute;Zahlen
01.01.2020;Rüdiger; 1.000.000,11
02.01.2020;Günther; 12,34
03.01.2020;Jürgen; 567,89
它被编码为“cp1252”。我使用“CSV (MS-DOS)”选项将其保存在 Windows 上。
最佳答案
converters = {'Datum': lambda x: pd.to_datetime(x, format='%d.%m.%Y')}
df1 = pd.read_csv('german_csv_test.csv', sep=';', thousands='.', decimal=',', encoding='latin1',
converters=converters, index_col='Datum')
德国 csv 文件很棘手,因为乍一看它们看起来不错,但数据类型都是错误的,而且月份和日期之间的切换可能会令人沮丧。上述参数适用于各种欧洲 csv 文件。下面我将解释每个参数。
sep=';'
几乎所有德语 csv 文件都使用分号“;”作为分隔符。这适用于大多数欧洲国家。您可能会说这是错误的,因为 csv 意味着“逗号分隔值”。但这不是对错的问题,而是惯例的问题。你可以说 csv 代表 "character separated values" .
thousands='.'
和decimal=','
此外,大多数欧洲国家/地区使用点来对千位进行分组,并使用逗号来分隔小数。 This great article解释原因。
encoding='latin1'
如果您在 Python documentation 中查找德语编码您将看到德语的编解码器“cp273”。它很少被使用。对于西欧,您应该可以使用“latin1”。使用此编解码器受益于 CPython 中的内部优化:
CPython implementation detail: Some common encodings can bypass the codecs lookup machinery to improve performance. These optimization opportunities are only recognized by CPython for a limited set of (case insensitive) aliases: utf-8, utf8, latin-1, latin1, iso-8859-1, iso8859-1, mbcs (Windows only), ascii, us-ascii, utf-16, utf16, utf-32, utf32, and the same using underscores instead of dashes. Using alternative aliases for these encodings may result in slower execution.
要进一步阅读,请查找 this SO post和 Joel Spolsky's blog .
converters=converters
大多数 pandas 用户都低估了转换器的重要性。它看起来像是一个简单问题的复杂解决方案。为什么不在读取文件后使用pd.to_datetime()
?您希望将输入与数据处理分开(请参阅 IPO model )。
我已经多次看到(并写过)这样的东西:
df = pd.read_csv('test.csv')
df['Revenue'] = df['Price'] * df['Quantity'] # I don't have to clean up all columns. I just need the revenue.
(...) # Some other code
# Plotting revenue
df['Revenue'] = df['Revenue'] / 1000
df['Date'] = pd.to_datetime(df['Date']) # Oh, the dates are still strings. I can fix this easily before plotting.
在下一次迭代中,您可以将 pd.to_datetime()
向上移动。但也许不是。这可能会导致一些意想不到的行为。编写此类代码两个月后,您只会看到一长串非结构化的 pandas 操作,并且您会认为“这真是一团糟。”
有多种方法可以清理数据框。但为什么不使用内置转换器呢?如果您为数据帧的每一列定义了dtypes
和converters
,您就不必回头(愤怒地)。调用 pd.read_csv()
后,您就站稳了脚跟。
请注意,转换器仅接受函数。这就是我在转换器中使用 lambda 函数的原因。否则我无法指定格式参数。
在 documentation 中了解有关转换器的更多信息并在 this SO post
index_col='Datum'
这只是定义索引列。它很方便,因为替代的 df = df.set_index('Datum') 不太漂亮。此外,它还有助于 - 像转换器一样 - 将输入 block 与数据处理分开。
关于python - 如何用 pandas 打开德语 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62872697/
pandas.crosstab 和 Pandas 数据透视表似乎都提供了完全相同的功能。有什么不同吗? 最佳答案 pivot_table没有 normalize争论,不幸的是。 在 crosstab
我能找到的最接近的答案似乎太复杂:How I can create an interval column in pandas? 如果我有一个如下所示的 pandas 数据框: +-------+ |
这是我用来将某一行的一列值移动到同一行的另一列的当前代码: #Move 2014/15 column ValB to column ValA df.loc[(df.Survey_year == 201
我有一个以下格式的 Pandas 数据框: df = pd.DataFrame({'a' : [0,1,2,3,4,5,6], 'b' : [-0.5, 0.0, 1.0, 1.2, 1.4,
所以我有这两个数据框,我想得到一个新的数据框,它由两个数据框的行的克罗内克积组成。正确的做法是什么? 举个例子:数据框1 c1 c2 0 10 100 1 11 110 2 12
TL;DR:在 pandas 中,如何绘制条形图以使其 x 轴刻度标签看起来像折线图? 我制作了一个间隔均匀的时间序列(每天一个项目),并且可以像这样很好地绘制它: intensity[350:450
我有以下两个时间列,“Time1”和“Time2”。我必须计算 Pandas 中的“差异”列,即 (Time2-Time1): Time1 Time2
从这个 df 去的正确方法是什么: >>> df=pd.DataFrame({'a':['jeff','bob','jill'], 'b':['bob','jeff','mike']}) >>> df
我想按周从 Pandas 框架中的列中累积计算唯一值。例如,假设我有这样的数据: df = pd.DataFrame({'user_id':[1,1,1,2,2,2],'week':[1,1,2,1,
数据透视表的表示形式看起来不像我在寻找的东西,更具体地说,结果行的顺序。 我不知道如何以正确的方式进行更改。 df示例: test_df = pd.DataFrame({'name':['name_1
我有一个数据框,如下所示。 Category Actual Predicted 1 1 1 1 0
我有一个 df,如下所示。 df: ID open_date limit 1 2020-06-03 100 1 2020-06-23 500
我有一个 df ,其中包含与唯一值关联的各种字符串。对于这些唯一值,我想删除不等于单独列表的行,最后一行除外。 下面使用 Label 中的各种字符串值与 Item 相关联.所以对于每个唯一的 Item
考虑以下具有相同名称的列的数据框(显然,这确实发生了,目前我有一个像这样的数据集!:() >>> df = pd.DataFrame({"a":range(10,15),"b":range(5,10)
我在 Pandas 中有一个 DF,它看起来像: Letters Numbers A 1 A 3 A 2 A 1 B 1 B 2
如何减去两列之间的时间并将其转换为分钟 Date Time Ordered Time Delivered 0 1/11/19 9:25:00 am 10:58:00 am
我试图理解 pandas 中的下/上百分位数计算,但有点困惑。这是它的示例代码和输出。 test = pd.Series([7, 15, 36, 39, 40, 41]) test.describe(
我有一个多索引数据框,如下所示: TQ bought HT Detailed Instru
我需要从包含值“低”,“中”或“高”的数据框列创建直方图。当我尝试执行通常的df.column.hist()时,出现以下错误。 ex3.Severity.value_counts() Out[85]:
我试图根据另一列的长度对一列进行子串,但结果集是 NaN .我究竟做错了什么? import pandas as pd df = pd.DataFrame([['abcdefghi','xyz'],
我是一名优秀的程序员,十分优秀!