2017-06-21 9 views
0

私の質問は、this answerからPhilまでです。 コード私は<class>の代わりに<class 'numpy.str'>を取得する方法numpy.object _ '>

sa = df_to_sarray(df.reset_index()) 

を実行する場合、私は次のような結果を得るでしょうしながら、

df = pd.DataFrame([[1,31,2.5,1260759144], [1,1029,3,1260759179], 
        [1,1061,3,1260759182],[1,1129,2,1260759185], 
        [1,1172,4,1260759205],[2,31,3,1260759134], 
        [2,1111,4.5,1260759256]], 
        index=list(['a','c','h','g','e','b','f',]), 
        columns=list(['userId','movieId','rating','timestamp'])) 
df.index.names=['ID No.'] 
df.columns.names=['Information'] 

def df_to_sarray(df): 
    """ 
    Convert a pandas DataFrame object to a numpy structured array. 
    This is functionally equivalent to but more efficient than 
    np.array(df.to_array()) 

    :param df: the data frame to convert 
    :return: a numpy structured array representation of df 
    """ 
    v = df.values 
    cols = df.columns 
# df[k].dtype.type is <class 'numpy.object_'>,I want to convert it to numpy.str 
    types = [(cols[i], df[k].dtype.type) for (i, k) in enumerate(cols)] 
    dtype = np.dtype(types) 
    z = np.zeros(v.shape[0], dtype) 
    for (i, k) in enumerate(z.dtype.names): 
     z[k] = v[:, i] 
    return z 
sa = df_to_sarray(df.reset_index()) 
print(sa) 

フィルの答えは、うまく機能しています。

array([('a', 1, 31, 2.5, 1260759144), ('c', 1, 1029, 3.0, 1260759179), 
     ('h', 1, 1061, 3.0, 1260759182), ('g', 1, 1129, 2.0, 1260759185), 
     ('e', 1, 1172, 4.0, 1260759205), ('b', 2, 31, 3.0, 1260759134), 
     ('f', 2, 1111, 4.5, 1260759256)], 
     dtype=[('ID No.', 'O'), ('userId', '<i8'), ('movieId', '<i8'), ('rating', '<f8'), ('timestamp', '<i8')]) 

私は次のようにdtypeを取得できたらいいですか?

dtype=[('ID No.', 'S'), ('userId', '<i8'), ('movieId', '<i8'), ('rating', '<f8'), ('timestamp', '<i8')] 

オブジェクトの代わりに文字列。

私はdf [k] .dtype.typeの型をテストしました。私はそれが<class 'numpy.object_'>であることを発見しました。これをnumpy.strに変換したいと思います。どうやってするか?

+0

'' 'df [col] .astype(str)' ''を試したことがありますか? –

+0

'種類 'はiistです。だから、最初のタプルを変更できるはずです。これはおそらく '(ID番号 '、' O ')'です。 – hpaulj

+0

私は 'オブジェクト'タイプを '文字列'に変換するだけで、 'int'型の他のカラムについては、それらを 'int'として保持したいと思います。 – Renke

答えて

1

reset_indexの後、データフレームのdtypeにはオブジェクトと数値が混在しています。索引付けはオブジェクトであり、文字列ではありません。

In [9]: df1=df.reset_index() 
In [10]: df1.dtypes 
Out[10]: 
Information 
ID No.  object 
userId   int64 
movieId  int64 
rating  float64 
timestamp  int64 
dtype: object 

df1.valuesは、(7,5)オブジェクトdtypeアレイである。正しいdtype

、あなたのアプローチはうまく(私はPY3上で使用する「U2」よ)ん:

In [31]: v = df1.values 
In [32]: dt1=np.dtype([('ID No.', 'U2'), ('userId', '<i8'), ('movieId', '<i8'), 
    ...: ('rating', '<f8'), ('timestamp', '<i8')]) 
In [33]: z = np.zeros(v.shape[0], dtype=dt1) 
In [34]: 
In [34]: for i,k in enumerate(dt1.names): 
    ...:  z[k] = v[:, i] 
    ...:  
In [35]: z 
Out[35]: 
array([('a', 1, 31, 2.5, 1260759144), ('c', 1, 1029, 3. , 1260759179), 
     ('h', 1, 1061, 3. , 1260759182), ('g', 1, 1129, 2. , 1260759185), 
     ('e', 1, 1172, 4. , 1260759205), ('b', 2, 31, 3. , 1260759134), 
     ('f', 2, 1111, 4.5, 1260759256)], 
     dtype=[('ID No.', '<U2'), ('userId', '<i8'), ('movieId', '<i8'), ('rating', '<f8'), ('timestamp', '<i8')]) 

だから、トリックはデータフレームからそのdt1を導出することです。私たちは事前に、我々は有効にすることを知っている必要があり

def foo(atype): 
    if atype==np.object_: 
     return 'U2' 
    return atype 
In [59]: types = [(cols[i], foo(df1[k].dtype.type)) for (i, k) in enumerate(cols)] 

いずれの場合も:作品

In [36]: cols=df1.columns 
In [37]: types = [(cols[i], df1[k].dtype.type) for (i, k) in enumerate(cols)] 
In [38]: types 
Out[38]: 
[('ID No.', numpy.object_), 
('userId', numpy.int64), 
('movieId', numpy.int64), 
('rating', numpy.float64), 
('timestamp', numpy.int64)] 
In [39]: types[0]=(types[0][0], 'U2') 
In [40]: types 
Out[40]: 
[('ID No.', 'U2'), 
('userId', numpy.int64), 
('movieId', numpy.int64), 
('rating', numpy.float64), 
('timestamp', numpy.int64)] 
In [41]: 
In [41]: z = np.zeros(v.shape[0], dtype=types) 

も工事中の列DTYPEを微調整:建設後の

編集typesは一つの選択肢であります特定のstringタイプへのobjectカラム。より一般的なものではありません。

アレイを抽出する前に、そのID列のdtypeを変更できるかどうかはわかりません。 .valuesは、列dtypesが混在しているため、dtypeオブジェクトになります。

+0

ありがとうございました。 – Renke

関連する問題