偶像说,不在于广,而在于渊。
桢子姐姐也说,qcy,你为什么不继续做你的技术呢?…没想到你竟是这种人…(虽然不知道是神马意思…)
非常感谢身边有这种时刻提醒你“好自为之、警钟长鸣”的好朋友。
确实,越来越需要对已有的知识储备进行深挖。
准备毕业,从现在开始深入下去。
读一行行存储的JSON字符串文件(\n是文件换行,而不是以逗号分隔的csv)
import json path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt' records = [json.loads(line) for line in open(path)] # 一行为一个element,存入list
key in dict # key 是否在dict.keys()中
所谓的标准库
from collections import defaultdict def get_counts2(sequence): counts = defaultdict(int) # values will initialize to 0 for x in sequence: counts[x] += 1 return counts
defaultdict(int), defaultdict(float), defaultdict(str),defaultdict(dict)
对dict的排序
把dict中的k,v生成tuple
l = [(k, v) for k, v in dict.items()][(k, d[k]) for k in dict.keys()] # 我喜欢这么写
l.sort() # 根据k排序 -_-!
用collections标准库
from collections import Counter counts = Counter(time_zones) counts.most_common(10)
x=np.array([1,4,3,-1,6,9]) x.argsort() # 返回从小到大的索引值 np.where(series.str.constains('表达式或正则表达式规则'), 'x', 'y') # np.where是,则输出'x',否则输出'y'
聚合 groupby , sum() # 每一类的个数
groupby('xxx') 需要区分:sum、count、size
sum:如果是数字,就加总
count:数数,每一列都数数(不知道nan会不会计入)
size:按'xxx'数数,每一类一共多少个。
对pandas的一列series计数
df['x'].value_counts()
pd.value_counts(df['x'], sort=False) # 计数完毕后,是否排序
unstack # 展开,不要透视
dataframe:pivot,pivot_table
pd.merge(df1, df2) # 尤其适用于3NF的数据库,主外键,合并到一张表里操作
pivot,经常是把按行存的,转成一列列的数据。
如:
时间 | 代码 | 价格 |
2018/3/1 | 601318 | 70 |
2018/3/1 | 601398 | 7 |
... | ||
2018/3/10 | 601318 | 72 |
2018/3/10 | 601398 | 8 |
转成
601318 | 601398 | |
2018/3/1 | 70 | 7 |
... | ||
2018/3/10 | 72 | 8 |
... |
例子:求电影平均得分
合并多个df,默认按行合并
pd.concat([df1, df2, df3], ignore_index=True) # 要去掉原来df中的index。
另一种做法是合并以后,reset_index
统计:每年出生的男生、女生人数
判断一个浮点数是否为1
print(np.allclose(1.0+1e-6,1))
print(1.0+1e-6 == 1)
print(1.0+1e-10 == 1)
两个df是否一致(尤其是浮点数)
assert Equal??
例:求男女比例(A[i, j] / sum(A[i, :]))。
对每一行进行归一化(非常常见的操作)
竖着除
横着除(很诡异!)
怎么解决?? 终于试出来了!
或者 更神奇的做法
列相加,再行去除
sort_values: 按某一列的值排序 (ascending可选)
sort_index: 按index排序(ascending可选)
关于数据分位数
1. 正找 --> 处于0.8的数是几
还可以选择插值法
interpolation(插值方法) : {‘linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’}
2. 反求 --> 0.11111 在什么位置
series.searchsorted(某个数) --> 返回在这个已经排序的series中的下标
dataframe的map
定义一个函数: f = lambda x: x*2
df['x'].map(f) # df['x'] = df['x'].apply(lambda x: x*2)
元素去重,且不改变顺序(用set,会改变顺序)
df['x'].unique() --> 即可
import numpy as np A = [1, 2, 2, 3, 4, 3] a = np.unique(A) print a # 输出为 [1 2 3 4] a, b, c = np.unique(A, return_index=True, return_inverse=True) print a, b, c # 输出为 [1 2 3 4], [0 1 3 4], [0 1 1 2 3 2]
isin函数
场景:去掉df中的一些元素,若df['x'] 不等于 1 或 'a' 或 'qcy' 或 'lrx'。
isin, ~ isin
另外:
groupby,
merge & concat,
apply, map, applymap, lambda
...
好好学!
标准库!一定好好看API!