利用Python进行数据分析(1):第2章,url、电影评分、婴儿名

偶像说,不在于广,而在于渊。

桢子姐姐也说,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
...    
pivot_table

例子:求电影平均得分





合并多个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!

猜你喜欢

转载自blog.csdn.net/qcyfred/article/details/79774738