是否有一种首选方法可以将numpy数组的数据类型固定为int(int64或者其他),同时仍然将内部元素列为numpy.NaN?
特别是,我正在将内部数据结构转换为Pandas DataFrame.在我们的结构中,我们有整数类型的列仍然有NaN(但列的dtype是int).如果我们把它变成一个DataFrame,它似乎将所有东西重铸为浮点数,但我们真的很喜欢int.
思考?
事情尝试:
我尝试使用from_records()pandas.DataFrame下的函数coerce_float=False,但这并没有帮助.我也尝试使用带有NaN fill_value的NumPy掩码数组,这也没有用.所有这些都导致列数据类型变为浮点数.
我已经在Pandas中读取了一个SQL查询,并且这些值以dtype'object'形式出现,尽管它们是字符串,日期和整数.我能够将日期'对象'转换为Pandas datetime dtype,但是在尝试转换字符串和整数时遇到错误.
这是一个例子:
>>> import pandas as pd
>>> df = pd.read_sql_query('select * from my_table', conn)
>>> df
id date purchase
1 abc1 2016-05-22 1
2 abc2 2016-05-29 0
3 abc3 2016-05-22 2
4 abc4 2016-05-22 0
>>> df.dtypes
id object
date object
purchase object
dtype: object
Run Code Online (Sandbox Code Playgroud)
将df['date']日期转换为日期时间:
>>> pd.to_datetime(df['date'])
1 2016-05-22
2 2016-05-29
3 2016-05-22
4 2016-05-22
Name: date, dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)
但是在尝试将其转换df['purchase']为整数时出现错误:
>>> df['purchase'].astype(int)
....
pandas/lib.pyx in pandas.lib.astype_intsafe (pandas/lib.c:16667)()
pandas/src/util.pxd in util.set_value_at (pandas/lib.c:67540)()
TypeError: …Run Code Online (Sandbox Code Playgroud) 我有一个名为pandas的DataFrame对象xiv,它有一列int64Volume测量值.
In[]: xiv['Volume'].head(5)
Out[]:
0 252000
1 484000
2 62000
3 168000
4 232000
Name: Volume, dtype: int64
Run Code Online (Sandbox Code Playgroud)
我已经阅读了其他帖子(比如这个和这个),提出了以下解决方案.但是,当我使用任何一种方法时,它似乎不会改变dtype底层数据:
In[]: xiv['Volume'] = pd.to_numeric(xiv['Volume'])
In[]: xiv['Volume'].dtypes
Out[]:
dtype('int64')
Run Code Online (Sandbox Code Playgroud)
要么...
In[]: xiv['Volume'] = pd.to_numeric(xiv['Volume'])
Out[]: ###omitted for brevity###
In[]: xiv['Volume'].dtypes
Out[]:
dtype('int64')
In[]: xiv['Volume'] = xiv['Volume'].apply(pd.to_numeric)
In[]: xiv['Volume'].dtypes
Out[]:
dtype('int64')
Run Code Online (Sandbox Code Playgroud)
我也尝试制作一个单独的pandas Series并使用上面列出的方法在该系列上并重新分配给x['Volume']obect,这是一个pandas.core.series.Series对象.
但是,我已经使用numpy包的float64类型找到了解决这个问题的方法- 这有效,但我不知道它为什么会有所不同.
In[]: xiv['Volume'] = xiv['Volume'].astype(np.float64)
In[]: xiv['Volume'].dtypes
Out[]:
dtype('float64') …Run Code Online (Sandbox Code Playgroud) 尝试将 csv 文件读入我的数据类型时出现值错误。我需要确保它有效并且每一行都被读入并且是正确的。
错误例如:
Pandas: ValueError: Integer column has NA values in column 2
Run Code Online (Sandbox Code Playgroud)
我试图在 Pandas Python 库中转换为整数,但有一个值。
但是,我读入的 csv 文件似乎有一些错误的条目,因为它由手动输入的测试结果组成。
我读到使用这个命令:
test = pd.read_csv("test.csv", sep=";", names=pandasframe_names, dtype=pandasframe_datatypes, skiprows=1)
Run Code Online (Sandbox Code Playgroud)
名称为 A、B、C、D 和 E,并且定义正确。
如果有错误的条目,我需要一种处理此问题而不丢失整行的方法。
这是我的情况:我有一个 pandas 数据框,它读取 csv 表,该表有 5 列,标题为 A、B、C、D、E。我使用参数skiprows=1 跳过第一行
pandas_datatypes={'A': pd.np.int64, 'B':pd.np.int64, 'C':pd.np.float64, 'D':object, 'E':object}
Run Code Online (Sandbox Code Playgroud)
我的行有 5 列,前 2 列是 int64,第三列是 float64,接下来的 2 列是对象(例如字符串)
当我读入它时,这些相当于我的数据类型。含义dtype=pandas_datatypes
现在我有这样的条目:
entry 1: 5; 5; 2.2; pedagogy; teacher (correct)
entry 2: 8; 7.0; 2.2; pedagogy; teacher (incorrect, as second is …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 DF 中的一些浮点列转换为 int,但出现上述错误。我尝试过将其转换以及 fillna 为 0(我不喜欢这样做,因为在我的数据集中需要 NA)。
我究竟做错了什么?我都尝试过:
orginalData[NumericColumns] = orginalData[NumericColumns].astype('Int64')
#orginalData[NumericColumns] = orginalData[NumericColumns].fillna(0).astype('Int64')
Run Code Online (Sandbox Code Playgroud)
但它一直导致同样的错误
TypeError: cannot safely cast non-equivalent float64 to int64
Run Code Online (Sandbox Code Playgroud)
我可以做什么来转换列?
我正在尝试使用scikit-learn在数据集上运行一些机器学习算法.我的数据集有一些类似于类别的功能.就像一个特征是A,其值1,2,3指定了某些东西的质量.1:Upper, 2: Second, 3: Third class.所以它就像一个序数变量.
同样地,我已经重新编码的变量城市,有三个值('London', Zurich', 'New York'成1,2,3,但与价值没有具体的偏好.所以现在这是一个名义上的分类变量.
如何在pandas中指定算法将其视为分类和序数等?与R一样,分类变量由因子(a)指定,因此不被视为连续值.在pandas/python中有类似的东西吗?
解决这个问题的最佳方法是什么?
谢谢
我使用以下代码通过指定每个列的类型来读取 csv:
clean_pdf_type=pd.read_csv('table_updated.csv',usecols=col_names,dtype =col_types)
Run Code Online (Sandbox Code Playgroud)
但它有错误:
ValueError: Integer column has NA values in column 298
Run Code Online (Sandbox Code Playgroud)
不确定如何跳过 NA?
我有一个带有浮点(十进制)索引的pandas DataFrame,我用它来查找值(类似于字典).由于浮点数不完全是它们应该将所有值乘以10,并.astype(int)在将其设置为索引之前将其转换为整数.然而,这似乎做了一个floor而不是四舍五入.因此1.999999999999999992被转换为1而不是2.使用pandas.DataFrame.round()之前的方法舍入不会避免此问题,因为值仍然存储为浮点数.
最初的想法(显然是一个关键错误)是这样的:
idx = np.arange(1,3,0.001)
s = pd.Series(range(2000))
s.index=idx
print(s[2.022])
Run Code Online (Sandbox Code Playgroud)
尝试转换为整数:
idx_int = idx*1000
idx_int = idx_int.astype(int)
s.index = idx_int
for i in range(1000,3000):
print(s[i])
Run Code Online (Sandbox Code Playgroud)
输出总是有点随机,因为整数的"实数"值可能略高于或低于所需值.在这种情况下,索引包含值1000的两倍,并且不包含值2999.
df = pd.read_csv("data.csv", encoding = "ISO-8859-1")
Run Code Online (Sandbox Code Playgroud)
现在,我有一个列,其中的值如下:
参考样本数据:
现在,我想使用以下代码将列 a 转换为数字格式:
df[['A']] = df[['A']].astype(int)
Run Code Online (Sandbox Code Playgroud)
它给了我一个错误。问题是我将所有三个(nan、连字符和逗号)都放在一列中,并且需要一起解决它们。有没有更好的方法来转换这些而不用替换(nan 到 -1)之类的东西?
给定如下数据框
colVals = [['05:17:55.703', '', '', '', '', '', '21', '', '3', '89', '891', '11', ''], ['05:17:55.703', '', '', '', '', '', '21', '', '3', '217', '891', '12', ''], ['05:17:55.703', '', '', '', '', '', '21', '', '3', '217', '891', '13', ''], ['05:17:55.703', '', '', '', '', '', '21', '', '3', '217', '891', '15', ''], ['05:17:55.703', '', '', '', '', '', '21', '', '3', '217', '891', '16', ''], ['05:17:55.703', '', '', '', '', '', '21', '', '3', '217', '891', '17', …Run Code Online (Sandbox Code Playgroud) 我在转换包含字符串格式(类型:str)和NaN(类型:float64)的2位数字的列时遇到问题.我想以这种方式获得一个新列:NaN,其中有NaN和整数,其中有两个数字的字符串格式.举个例子:我想从列YearBirth1获取列Yearbirth2,如下所示:
YearBirth1 #numbers here are formatted as strings: type(YearBirth1[0])=str
34 # and NaN are floats: type(YearBirth1[2])=float64.
76
Nan
09
Nan
91
YearBirth2 #numbers here are formatted as integers: type(YearBirth2[0])=int
34 #NaN can remain floats as they were.
76
Nan
9
Nan
91
Run Code Online (Sandbox Code Playgroud)
我试过这个:
csv['YearBirth2'] = (csv['YearBirth1']).astype(int)
Run Code Online (Sandbox Code Playgroud)
正如我所料,我得到了这个错误:
ValueError: cannot convert float NaN to integer
Run Code Online (Sandbox Code Playgroud)
所以我尝试了这个:
csv['YearBirth2'] = (csv['YearBirth1']!=NaN).astype(int)
Run Code Online (Sandbox Code Playgroud)
并得到这个错误:
NameError: name 'NaN' is not defined
Run Code Online (Sandbox Code Playgroud)
最后我试过这个:
csv['YearBirth2'] = (csv['YearBirth1']!='NaN').astype(int)
Run Code Online (Sandbox Code Playgroud)
没有错误,但当我检查列YearBirth2时,这是结果:
YearBirth2:
1
1
1
1
1
1
Run Code Online (Sandbox Code Playgroud)
非常糟糕..我认为这个想法是正确的但是有一个问题让Python能够理解我对NaN的意思..或者我尝试的方法可能是错的..
我也使用了pd.to_numeric()方法,但这种方式我获得了浮点数,而不是整数.
有什么帮助?!谢谢大家! …