初学pandas与seaborn(四)datafra…

来源:互联网 发布:青岛软件评测中心 编辑:程序博客网 时间:2024/06/05 00:11
  由于实在没找到或者下载到大数据,只能自己编个不大不小的数据。
  给定初始金额s,2个人轮流拿,头一个人可以拿n个(n<= s-1),第二个人可以拿n_2 =1~2n个,然后刚才那第一人可以拿1~2(n_2)个,也就是之后的人都能在1到上一个人拿的2倍之间拿钱,最后一个拿的胜利。这是一个类是巴什博弈的问题,用动态规划来解,推导到5000的情况。存了624万种博弈可能(当然有很多冗余没剔除,毕竟推导到5000,D(x,5000)的情况是不用存储的)
  使用字符串存储为CSV格式,大小332MB。
  read_csv()读取时间:
  7.825 sec
  数据第一列是动态规划的“状态”,第二列是“适应与否”,第三列是必赢策略中可进入的上一个状态(多个状态用空格隔开)。状态描述为:
  D(n,s) —— s代表到“我”拿的时候剩余多少钱,n表示到我的时候上家拿了多少钱。

  用了用比较pandas里面比较有意思的语句:选关键的行和列
  print resultData.loc[10:20, ['D(1-1)', 'Unnamed: 2']]
  对象使用loc方法,即可选用行和列。这里输入的行,采用了python式的冒号选择法,即第11行(从0开始,编号为10即第11行)到第21行。列选择了D(1-1)列和Unnamed:2列。
  似乎直接使用默认的csv读取函数,不加额外参数的话,pandas依然会把第一行当成标题。而我所制作的数据里面,第一行就是数据,没有给标题,结果它直接把我的数据给默认成标题了,如D(1-1)。而没有数据的部分,则给了个unnamed:2作为标题。更郁闷的是,莫名其妙我多了一列空数据Unnamed: 3……Orz

  我们看看读取方面。不加列选择的读取:
  print resultData[0:10]
  用时:0.00399994850159sec

  选择个别列与行的读取:
  print resultData.loc[10:20, ['D(1-1)', 'Unnamed: 2']]
  用时:0.276999950409sec (强烈怀疑大部分时间是不是都消耗在了字符串查找上了

  其他的语句方面,似乎pandas提供了更快的标量读取方法?

For getting a scalar value

In [30]: df.loc[dates[0],'A'] 
Out[30]: 0.46911229990718628

For getting fast access to a scalar (equiv to the prior method)

In [31]: df.at[dates[0],'A'] 
Out[31]: 0.46911229990718628
  于是我们来测试下单个数据读取的情况:
print resultData.loc[30,'Unnamed: 2'], resultData.loc[43453, 'Unnamed: 2'],resultData.loc[6001234, 'Unnamed: 2']

print resultData.at[30,'Unnamed: 2'], resultData.at[43453, 'Unnamed: 2'],resultData.at[6001234, 'Unnamed: 2']

print resultData.iloc[40, 1],resultData.iloc[402134, 2], resultData.iloc[4032, 3]
  由于速度太快,三条语句都无法对比:
  无论是iloc、loc还是at方法,测算的结果都是0.0sec


  我们来看看按照行数和列数来读取(使用int而不是String来查找行和列)
  print resultData.iloc[30]
  使用这条语句,花费了:0.00200009346008sec

  print resultData.iloc[3:5,0:2]
  使用这条语句,花费了:0.003sec
  这个连续选取行和列的语句有个值得注意的地方,这里的3:5是指第三行到第四行0:2是指第0列到第1列,它并没有把后面数字所指示的行和列包含进去。如果你要选取第3、4、5行,则应该输入3:6。对于列,输入的规则也是一样。为了避免歧义,数据量不大的情况下,可以选择使用下面的语句:
  print resultData.iloc[[3, 4, 5, 7, 8, 9], [1, 2, 3]]
  使用这条语句,花费了:0.003sec


  综合感觉来看,只要是选择具体的行和列的,都会花些时间。单独选取某行和某单元格,花费的时间不算多。具体抽取数据所需要的时间受cpu和内存是否预热影响很大,结果仅作参考。单个读取数据,pandas同样提供了数值int访问方式:

For getting a value explicitly

In [37]: df.iloc[1,1]
Out[37]: -0.17321464905330858

For getting fast access to a scalar (equiv to the prior method)

In [38]: df.iat[1,1] 
Out[38]: -0.17321464905330858

总结:如果使用标签访问,那么就不加i,直接用at、loc。如果使用序号访问,那么就加上i,如iat、iloc
0 0
原创粉丝点击