【问题标题】:Dataframe into numpy array with values comma seperated数据框到numpy数组中,值以逗号分隔
【发布时间】:2018-01-19 03:00:19
【问题描述】:

情景

我已将 csv(以 \t 分隔)读入 Dataframe,现在需要采用 numpy 数组格式进行聚类而不更改类型

问题

到目前为止,根据尝试过的参考资料(如下),我未能按要求获得输出。我试图获取的两列值在 int64 / float64 中,如下所示

         uid   iid       rat
0        196   242  3.000000
1        186   302  3.000000
2         22   377  1.000000

我目前只对 iidrat 感兴趣,并将其传递给 Kmeans.fit() 方法,而其中也不包含 EPSILON。我需要以下格式

预期格式

[[242, 3.000000],
[302, 3.000000],
[22, 1.000000]]

不成功的尝试

X = values[:, 1:2]
Y = values[:, 2:3]
someArray = np.array([X,Y])
print someArray

并没有在执行时告别

[[[  2.42000000e+02]
  [  3.02000000e+02]
  [  3.77000000e+02]
  ..., 
  [  1.35200000e+03]
  [  1.62600000e+03]
  [  1.65900000e+03]]
 [[  3.00000000e+00]
  [  3.00000000e+00]
  [  1.00000000e+00]
  ..., 
  [  1.00000000e+00]
  [  1.00000000e+00]
  [  1.00000000e+00]]]

到目前为止没有帮助的参考文献

  1. This one
  2. This two
  3. This three
  4. This four

编辑 1

试过np_df = np.genfromtxt('AllData.csv', delimiter='\t', unpack=True) 得到了这个

[[             nan   1.96000000e+02   1.86000000e+02 ...,   4.79000000e+02
    4.79000000e+02   4.79000000e+02]
 [             nan   2.42000000e+02   3.02000000e+02 ...,   1.36000000e+03
    1.39400000e+03   1.65200000e+03]
 [             nan   3.00000000e+00   3.00000000e+00 ...,   2.00000000e+00
    1.92803605e+00   1.00000000e+00]]

【问题讨论】:

  • values.iloc[:, 1:].values?
  • 文件是逗号还是制表符分隔?
  • @ayhan 请检查预期的格式,它只打印第 1 列和第 2 列
  • @BenT 已经提到,\t 或 Tab 分隔
  • 我看不出预期格式和我的建议输出之间有任何区别(除了第三行中的 22,我认为这是一个错误)。

标签: python arrays pandas numpy


【解决方案1】:

看来你需要read_csvDataFrame 首先过滤第二列和第三列,然后通过values 转换为numpy 数组: 将熊猫导入为 pd 从 sklearn.cluster 导入 KMeans 从 pandas.compat 导入 StringIO

temp=u"""col,iid,rat
4,1,0
5,2,4
6,3,3
7,4,1"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), usecols = [1,2])
print (df)
   iid  rat
0    1    0
1    2    4
2    3    3
3    4    1

X = df.values 
print (X)
[[1 0]
 [2 4]
 [3 3]
 [4 1]]

kmeans = KMeans(n_clusters=2)
a = kmeans.fit(X)
print (a)
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=2, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=None, tol=0.0001, verbose=0)

【讨论】:

  • 只是为了记录,我遵循的示例在列表的元素和列表之间有逗号,那么这是否意味着 Python 已经解除了这些规范?顺便说一句,这有帮助。
  • 逗号是读取 csv 中的默认分隔符,如果要更改它,请使用sep='\t' 用于制表符,sep='\s+' 用于一个或多个空格。
【解决方案2】:

使用基于标签的选择和生成的pandas 对象的.values 属性,这将是某种numpy 数组:

>>> df
   uid  iid  rat
0  196  242  3.0
1  186  302  3.0
2   22  377  1.0
>>> df.loc[:,['iid','rat']]
   iid  rat
0  242  3.0
1  302  3.0
2  377  1.0
>>> df.loc[:,['iid','rat']].values
array([[ 242.,    3.],
       [ 302.,    3.],
       [ 377.,    1.]])

注意,您的整数列将被提升为浮点数。

另外请注意,这个特定的选择可以通过不同的方式进行:

>>> df.iloc[:, 1:] # integer-position based
   iid  rat
0  242  3.0
1  302  3.0
2  377  1.0
>>> df[['iid','rat']] # plain indexing performs column-based selection
   iid  rat
0  242  3.0
1  302  3.0
2  377  1.0

我喜欢基于标签的,因为它更明确。

编辑

您没有看到逗号的原因是 numpy 数组的打印方式:

>>> df[['iid','rat']].values
array([[ 242.,    3.],
       [ 302.,    3.],
       [ 377.,    1.]])
>>> print(df[['iid','rat']].values)
[[ 242.    3.]
 [ 302.    3.]
 [ 377.    1.]]

实际上,是the difference between the str and repr numpy 数组的结果:

>>> print(repr(df[['iid','rat']].values))
array([[ 242.,    3.],
       [ 302.,    3.],
       [ 377.,    1.]])
>>> print(str(df[['iid','rat']].values))
[[ 242.    3.]
 [ 302.    3.]
 [ 377.    1.]]

【讨论】:

  • 试过print df.loc[:, ['iid','rat']].values 得到[[ 2.42000000e+02 3.00000000e+00] [ 3.02000000e+02 3.00000000e+00] [ 3.77000000e+02 1.00000000e+00] ..., [ 1.36000000e+03 2.00000000e+00] [ 1.39400000e+03 1.92803605e+00] [ 1.65200000e+03 1.00000000e+00]]
  • @Tejas 对我来说看起来是正确的......有什么问题?
  • @Tejas 但一般来说,不要在评论中转储它,它是不可读的。编辑您的实际问题
  • 兄弟,如果您看到的话,这不是在列表中的两个值之间放置逗号。
  • 添加的解决方案看起来不错。这解决了我 50% 的问题,我需要那些 e+ 或所谓的 EPSILONS 中的 wau
【解决方案3】:

为什么不直接将“csv”导入为 numpy 数组?

import numpy as np 
def read_file( fname): 
    return np.genfromtxt( fname, delimiter="/t", comments="%", unpack=True) 

【讨论】:

  • 试过 np_df = np.genfromtxt('AllData.csv', delimiter='\t', unpack=True) 并得到了这个 [[ nan 1.96000000e+02 1.86000000e+02 ..., 4.79000000e+02 4.79000000e+02 4.79000000e+02] [ nan 2.42000000e+02 3.02000000e+02 ..., 1.36000000e+03 1.39400000e+03 1.65200000e+03] [ nan 3.00000000e+00 3.00000000e+00 ..., 2.00000000e+00 1.92803605e+00 1.00000000e+00]] 最后得到了一个 NaN,我没想到。
  • 我实际上看不到您的数据,所以我不知道数据来自哪里,除非您保存的 csv 文件中有行号是字符串。您可以使用索引来删除 NaN,因为其余数据看起来正确。
  • 我看起来由于某种原因数据是侧向的,你应该转置它并切掉第一行
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
相关资源
最近更新 更多