相关疑难解决方法(0)

将pandas dataframe列导入为字符串而不是int

我想将以下csv导入为字符串而不是int64.Pandas read_csv自动将其转换为int64,但我需要将此列作为字符串.

ID
00013007854817840016671868
00013007854817840016749251
00013007854817840016754630
00013007854817840016781876
00013007854817840017028824
00013007854817840017963235
00013007854817840018860166


df = read_csv('sample.csv')

df.ID
>>

0   -9223372036854775808
1   -9223372036854775808
2   -9223372036854775808
3   -9223372036854775808
4   -9223372036854775808
5   -9223372036854775808
6   -9223372036854775808
Name: ID
Run Code Online (Sandbox Code Playgroud)

不幸的是使用转换器会产生相同的结

df = read_csv('sample.csv', converters={'ID': str})
df.ID
>>

0   -9223372036854775808
1   -9223372036854775808
2   -9223372036854775808
3   -9223372036854775808
4   -9223372036854775808
5   -9223372036854775808
6   -9223372036854775808
Name: ID
Run Code Online (Sandbox Code Playgroud)

python pandas

77
推荐指数
3
解决办法
10万
查看次数

获取pandas.read_csv将空值读取为空字符串而不是nan

我正在使用pandas库读取一些CSV数据.在我的数据中,某些列包含字符串.字符串"nan"是可能的值,空字符串也是如此.我设法让大熊猫把"nan"作为一个字符串来读,但我无法弄清楚如何让它不读取空值作为NaN.这是示例数据和输出

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven
Run Code Online (Sandbox Code Playgroud)

它正确地写着"男"为字符串"南",但仍读取空单元格作为NaN的.我想传递strconverters参数read_csv(带converters={'One': str})),但它仍然读取空单元格作为NaN的.

我知道读书,和fillna后,我可以填补值,但真的没有办法告诉大家,在一个特定的CSV列空单元格应该被解读为空字符串,而不是NaN的熊猫吗?

python csv pandas

67
推荐指数
4
解决办法
7万
查看次数

Pandas read_csv dtype前导零

所以我正在阅读NOAA的电台代码csv文件,如下所示:

"USAF","WBAN","STATION NAME","CTRY","FIPS","STATE","CALL","LAT","LON","ELEV(.1M)","BEGIN","END"
"006852","99999","SENT","SW","SZ","","","+46817","+010350","+14200","",""
"007005","99999","CWOS 07005","","","","","-99999","-999999","-99999","20120127","20120127"
Run Code Online (Sandbox Code Playgroud)

前两列包含气象站的代码,有时它们有前导零.当pandas在没有指定dtype的情况下导入它们时,它们会变成整数.这并不是什么大不了的事,因为我可以遍历数据框索引并用类似的东西替换它们,"%06d" % i因为它们总是六位数,但是你知道......这就是懒人的方式.

使用以下代码获取csv:

file = urllib.urlopen(r"ftp://ftp.ncdc.noaa.gov/pub/data/inventories/ISH-HISTORY.CSV")
output = open('Station Codes.csv','wb')
output.write(file.read())
output.close()
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但当我去尝试阅读它使用这个:

import pandas as pd
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': np.str, 'WBAN': np.str})
Run Code Online (Sandbox Code Playgroud)

要么

import pandas as pd
df = pd.io.parsers.read_csv("Station Codes.csv",dtype={'USAF': str, 'WBAN': str})
Run Code Online (Sandbox Code Playgroud)

我收到一条令人讨厌的错误消息:

File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 401, in parser
_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 216, in _read
    return parser.read()
  File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 633, in read
    ret = self._engine.read(nrows)
  File "C:\Python27\lib\site-packages\pandas-0.11.0-py2.7-win32.egg\pandas\io\parsers.py", line 957, in read
    data …
Run Code Online (Sandbox Code Playgroud)

python csv string pandas

7
推荐指数
3
解决办法
1万
查看次数

如何确保 Pandas 不会将数字字符串解释为 Pandas 中的数字?

我有读取这样的 CSV 的代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pandas as pd

csv_path = 'test.csv'
df = pd.read_csv(csv_path, delimiter=';', quotechar='"',
                 decimal=',', encoding="ISO-8859-1", dtype={'FOO': str})
df.FOO = df.FOO.map(lambda n: n.zfill(6))
Run Code Online (Sandbox Code Playgroud)

我得到

AttributeError: 'float' object has no attribute 'zfill'
Run Code Online (Sandbox Code Playgroud)

很明显,Pandas 将该列解释FOO为一个数字。它是数字,但我不想将其解释为数字

(我知道这df.FOO = df.FOO.map(lambda n: str(n).zfill(6))会使问题消失,但我想知道为什么会首先出现此问题。)

我使用熊猫 0.20.3。

示例 CSV

FOO;BAR
01,23;4,56
1,23;45,6
;987
Run Code Online (Sandbox Code Playgroud)

python csv pandas

3
推荐指数
1
解决办法
1502
查看次数

如何防止Python/pandas将id视为数字

我有一个 csv 数据集,其中一些 id 是非常长的数字,如下所示:

963839330864351104
426545668232740352
811862613586429056
Run Code Online (Sandbox Code Playgroud)

当我读取 csv 并将数据集转换为数据框时,pandas 错误地认为它是一个数字并将其转换为科学通知,因此上面的数字变成了这样:

9.638393308643511e+17
4.2654566823274035e+17
8.11862613586429e+17
Run Code Online (Sandbox Code Playgroud)

我尝试通过将系列转换为 int64 来解决这个问题,这在大多数情况下都有效,但问题是:

有些数字原本可能是这样的

191268415833367997
Run Code Online (Sandbox Code Playgroud)

现在,当数字从科学记数法变为 int64(或 int)后,数字变成这样:

191268415833368000 #some how pandas think that it's ok to round the number up
Run Code Online (Sandbox Code Playgroud)

我需要的是让 pandas 明白数据集中保存这些 id 的列是一个字符串列,它不应该被视为数字,可能是在导入时,所以我不会将数字转换为整数,然后再转换为字符串当我格式化工作并转换我的数据集以满足我的需求时。

我尝试过以下操作但没有成功:

  1. 我尝试将系列转换为 int 和 int64
  2. 我尝试使用 float_ precision='round_trip' 读取 csv
  3. 我尝试将包含 id 的系列转换为字符串
  4. 我尝试以不同的方式设置显示: pd.options.display.float_format = '{:.0f}'.format

我看到这个问题以不同的方式被问到,但没有明确的答案或我能够理解的东西来适应我的问题。它应该是直截了当的,但不知怎的却并非如此。

非常感谢您的帮助。

python pandas google-colaboratory

3
推荐指数
1
解决办法
619
查看次数

Python Dataframe - 在加载 from_csv 时将数据保留为字符串

from_csv 选择“04”作为值之一并将其转换为字符串。如何确保所有被拾取的列都是字符串?我希望避免处理单个列,因为有 114 列,并且我不想在列受到影响时进行分析。

python dataframe import-from-csv pandas

2
推荐指数
1
解决办法
2491
查看次数