Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将numpy数组更改为float_Python_Numpy_Pandas - Fatal编程技术网

Python 将numpy数组更改为float

Python 将numpy数组更改为float,python,numpy,pandas,Python,Numpy,Pandas,我有一个object类型的numpy数组。我想找到带有数值的列,并将它们转换为float。我还想找到具有对象值的列的索引。 这是我的尝试: import numpy as np import pandas as pd df = pd.DataFrame({'A' : [1,2,3,4,5],'B' : ['A', 'A', 'C', 'D','B']}) X = df.values.copy() obj_ind = [] for ind in range(X.shape[1]): tr

我有一个object类型的numpy数组。我想找到带有数值的列,并将它们转换为float。我还想找到具有对象值的列的索引。 这是我的尝试:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A' : [1,2,3,4,5],'B' : ['A', 'A', 'C', 'D','B']})
X = df.values.copy()
obj_ind = []
for ind in range(X.shape[1]):
    try:
        X[:,ind] = X[:,ind].astype(np.float32)
    except:
        obj_ind = np.append(obj_ind,ind)

print obj_ind

print X.dtype
这是我得到的输出:

[ 1.]
object

df.dtypes
返回可进一步操作的熊猫系列

# find columns of type int
mask = df.dtypes==int
# select columns for for the same
cols = df.dtypes[mask].index
# select these columns and convert to float
new_cols_df = df[cols].apply(lambda x: x.astype(float), axis=1)
# Replace these columns in original df
df[new_cols_df.columns] = new_cols_df

通常,您可以尝试将
astype
应用于每一列

In [590]: X[:,0].astype(int)
Out[590]: array([1, 2, 3, 4, 5])
但是你必须在一个单独的列表中收集结果。你不能把它们放回
X
。然后可以连接该列表

In [601]: numlist=[]; obj_ind=[]

In [602]: for ind in range(X.shape[1]):
   .....:     try:
   .....:         x = X[:,ind].astype(np.float32)
   .....:         numlist.append(x)
   .....:     except:
   .....:         obj_ind.append(ind)

In [603]: numlist
Out[603]: [array([ 3.,  4.,  5.,  6.,  7.], dtype=float32)]

In [604]: np.column_stack(numlist)
Out[604]: 
array([[ 3.],
       [ 4.],
       [ 5.],
       [ 6.],
       [ 7.]], dtype=float32)

In [606]: obj_ind
Out[606]: [1]

X
是一个带有dtype
对象的numpy数组

In [582]: X
Out[582]: 
array([[1, 'A'],
       [2, 'A'],
       [3, 'C'],
       [4, 'D'],
       [5, 'B']], dtype=object)
您可以使用相同的转换逻辑创建一个混合了int和object字段的结构化数组

In [616]: ytype=[]

In [617]: for ind in range(X.shape[1]):
    try:                        
        x = X[:,ind].astype(np.float32)
        ytype.append('i4')
    except:
        ytype.append('O')       

In [618]: ytype
Out[618]: ['i4', 'O']

In [620]: Y=np.zeros(X.shape[0],dtype=','.join(ytype))

In [621]: for i in range(X.shape[1]):
    Y[Y.dtype.names[i]] = X[:,i]

In [622]: Y
Out[622]: 
array([(3, 'A'), (4, 'A'), (5, 'C'), (6, 'D'), (7, 'B')], 
      dtype=[('f0', '<i4'), ('f1', 'O')])
[616]中的
:ytype=[]
In[617]:对于范围内的ind(X.shape[1]):
尝试:
x=x[:,ind].aType(np.float32)
ytype.append('i4')
除:
ytype.append('O')
In[618]:ytype
Out[618]:[i4',O']
在[620]中:Y=np.zero(X.shape[0],dtype=','.join(ytype))
In[621]:对于范围内的i(X.shape[1]):
Y[Y.dtype.names[i]=X[:,i]
In[622]:Y
出[622]:
数组([(3,'A'),(4,'A'),(5,'C'),(6,'D'),(7,'B')],

dtype=[('f0','我认为这可能会有所帮助

def func(x):
  a = None
  try:
    a = x.astype(float)
  except:
    # x.name represents the current index value 
    # which is column name in this case
    obj.append(x.name) 
    a = x
  return a

obj = []
new_df = df.apply(func, axis=0)
这将保留
对象
列,以便以后使用


注意:在使用
pandas.DataFrame时
避免使用循环迭代,因为这比使用
apply
执行相同的操作要慢得多。不清楚您在这里期望的是什么,您的输出显示第二列无法转换为float,并且数据类型是
object
,这是正确的ect,因为这是一个
str
dtype,如果需要列名,则返回
obj_ind=np.append(obj_ind,x.columns[ind])
我想将我的第一列转换为float@edchum类型
numpy
数组的元素不能有不同的
d类型
。您可能需要一个结构化数组,而这是否回答了您的问题?我发布的是一个最小的工作示例。在我的完整代码中,我将无法访问df。只能访问X。@shanmuga