初学pandas与seaborn(四)datafra…

  由于实在没找到或者下载到大数据,只能自己编个不大不小的数据。
  给定初始金额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.00399994850159 sec

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

  其他的语句方面,似乎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.00200009346008 sec

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


  综合感觉来看,只要是选择具体的行和列的,都会花些时间。单独选取某行和某单元格,花费的时间不算多。具体抽取数据所需要的时间受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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值