python学习随笔
1、选取标签为C并且只取前两行,选完类型还是dataframe
df = df.loc[0:2, ['A', 'C']] df = df.iloc[0:2, [0, 2]]
不同:loc是根据dataframe的具体标签选取列,而iloc是根据标签所在的位置,从0开始计数。
2、加减乘除等操作的,比如dataframe的一列是数学成绩(shuxue),另一列为语文成绩(yuwen),现在需要求两门课程的总和。可以使用df['shuxue'] +
df['yuwen'](选取完之后类型为series)来获得总分,而不能使用df.iloc[:,[2]]+df.iloc[:,[1]]或df.iloc[:,['shuxue']]+df.iloc[:,['yuwen']],这会产生错误结果。
3、使用df.icol(i)来选取列,选取完的也不是dataframe而是series,i为该列所在的位置,从0开始计数。
4、gran = int(round(np.timedelta64(largest - second_largest) / np.timedelta64(1, 's'))) #转换成秒
5、anoms = all_data[i][all_data[i].timestamp.isin(s_h_esd_timestamps)]
6、periodic_maxes = df.groupby( df.timestamp.map(Timestamp.date)).aggregate(np.max).value #按天求最大值
7、ESD_example_data = copy.deepcopy(total_Y)
8、对于给定的显著性水平,可以使用百分点函数(PPF)计算临界值,例如0.05(95%置信度)。
此功能可用于SciPy中的t分布,如下所示:
# calculate the critical value
alpha = 0.05
cv = t.ppf(1.0 - alpha, df)
p值可以用t分布上的累积分布函数来计算(同样在SciPy中)。
# calculate the p-value
p = (1 - t.cdf(abs(t_stat), df)) * 2
9、在Python中,如何将一个字符串数组转换成整型数组
py2:
>>> arr = ['22','44','66','88']
>>> arr = map(int,arr)
>>> print(arr)
[22, 44, 66, 88]
py3:
>>> arr = ['22','44','66','88']
>>> arr = list(map(int,arr))
>>> print(arr)
[22, 44, 66, 88]
10、时间戳转换成date
def time_to_datetime(time_at): str_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(1476923280)) return pd.to_datetime(str_time)
11、python进行数据处理——pandas的drop函数
https://blog.csdn.net/nuaadot/article/details/78304642
12、python 四位数整数补零
n = "%04d" % n print n
0123
13、同名文件
if os.path.exists(filename): raise ValueError("路径里千万不能有同名文件,否则会叠加文件!!!")
14、dataframe.to_csv(),(用pandas)写入时,当数据量很大时,行写入(30分钟)要比列写入(秒),慢好几百多倍
15、分段存储
for i in range(0, len(data), 10000): data[i:i+10000]
16、to_csv的参数设置, 'a'不覆盖
dataframe.to_csv(filename, mode='a', header=False, encoding='utf-8', index=False)
17、三位随机数:
str(random.randint(100, 999))
18、Python如何读取、拆分大文件
pd.read_table("data/ex1.csv", chunksize=10000, header=None, sep=',') for chunk in data: print(chunk)
19、np.float64 not float
datefram.astype(np.int64)
20、dropna
删除DataFrame中值全为NaN或者包含有NaN的列或行
删除NaN所在的行:
删除表中全部为NaN的行
df.dropna(axis=0,how='all')
删除表中含有任何NaN的行
df.dropna(axis=0,how='any') #drop all rows that have any NaN values
删除NaN所在的列:
删除表中全部为NaN的列
df.dropna(axis=1,how='all')
删除表中含有任何NaN的列
df.dropna(axis=1,how='any') #drop all rows that have any NaN values
21、按照时间天分组
data.groupby(data.index.map(Timestamp.date))
结果是tuple(Timestamp.date"2019-03-05", series)
22、连接series,,,pd.concat([data1, data2], axis=0)
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False)
参数说明
objs: series,dataframe或者是panel构成的序列lsit
axis: 需要合并链接的轴,0是行,1是列
join:连接的方式 inner,或者outer
23、自定义索引:data.set_index("timestamp", drop=False, inplace=True)
Pandas可以使用某一列来重新自定义DataFrame的索引,通过set_index()方法来实现,该方法主要有两个参数:
- inplace,如果设置为True就不会返回一个新的DataFrame,而是直接修改该DataFrame
- drop,如果设置为True,就会移出掉该列的数据
24、本地时间的区别
str_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time_at - 8 * 60 * 60)) str_time.fromtimestamp(time_at).strftime('%Y-%m-%d %H:%M:%S') str_time = datetime.utcfromtimestamp(time_at).strftime('%Y-%m-%d %H:%M:%S')
25、pandas.DataFrame的index重新排列(从0开始)
重新赋值pandas.DataFrame.index即可。
df1.index = range(len(df1))
df1.reset_index(drop=True, inplace=True)
26、
list = [] for i in range(100): if i % 2 == 1: list.append(i)
等价于
list = [i for i in range(100) if i % 2 == 1]
27、使用enumerate内置函数来给元素加上序号形成元组:
list = ['a', 'b', 'c'] for x in enumerate(list): print(x)
运行结果为: (0, 'a') (1, 'b') (2, 'c')
28、我们可以使用raise语句自己触发异常
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行
29、断言
assert isinstance(astring, str)
30、Python上下文管理器与with语句
上下文管理器的任务是:代码块执行前准备,代码块执行后收拾。
31、使用concurrent.futures实现并行计算
(1)创建进程池Executor
concurrent.futures.ProcessPoolExecutor(max_workers=None)
建立进程池Executor。max_workers表示进程池的进程数量限制,缺省为None,表示与CPU数量相同。
concurrent.futures.ThreadPoolExecutor(max_workers=None)
多讲一个线程池Executor的创建。
(2)创建子进程Future
(a)直接提交单个子进程:
XXX.submit(fn, *args, **kwargs)
向进程池提交一个子进程(future对象),子进程直接开始运行,并返回该future对象。future对象对应函数fn(*args, **kwargs)。XXX为进程池Executor。
(b)map方式(同时提交多个子进程):
XXX.map(fn, *iterables, timeout=None, chunksize=1)
并发map函数,返回迭代器(与map(fn,*iterables)返回相同,只是并发执行)。注意这个并行与mulitprocessing模块中的并行也有差异,这里是同批次的子进程同步执行,直到该批次所有进程结束后,才开始下一批次执行。XXX为进程池Executor。
fn:被调函数,
iterables:个数与被调函数的参数个数相同(每个iterable对应一个参数)。
timeout:最大等待时间。缺省为None,表示无限等待。
chunksize:缺省为1,表示iterables中的元素将一次送出1个到进程池。如大于1,则一次送出chunksieze个元素到进程池。对于非常大的iterables,设置较大的chunksize,将显著加快执行速度(只对ProcessPoolExecutor有用。对ThreadPoolExecutor无用,该值忽略)。
(3)with上下文管理
如果直接使用executor和future,多进程执行完成后,最好手动释放资源:
XXX.shutdown() #所有任务完成后,清理并释放进程池Executor相关的资源。
更好的办法是采用with上下文管理:
with concurrent.futures.ProcessPoolExecutor() as executor: res = executor.map(fuc, ...)
32、知识点:
random.random() :返回 0 <= n < 1的随机实数。
random.uniform(a,b) :返回 a <= n < b的随机实数。
random.randrange([start],stop,[step]) :返回range([start],stop,[step])的随机整数。
random.choice(seq) :返回seq序列中的任意元素。
random.shuffle(seq) :随机移位。
random.sample(seq,n) :从序列中取n个随机的元素。
33、pandas将index转换为datetime
df.index = pd.to_datetime(df.index)
34、设置坐标轴
ax = plt.gca() ax.set_xlabel('x-label', fontsize=fontsize) ax.set_ylabel('y-label', fontsize=fontsize) ax.set_title('Title', fontsize=fontsize)
35、经常遇到问题 ValueError: If using all scalar values, you must pass an index,因为pandas 的dataframe需要一个可迭代的对象
换成列表 或者加个index就可以解决这个问题
36、数字转换成excel列序号:
def convert_to_title(n): result = "" while n != 0: result = chr((n-1) % 26+65) + result n = (n-1)//26 return result
37、python 保留2位小数
1、round In [3]: a=21.2345 In [4]: round(a,2) Out[4]: 21.23 2、%nf In [5]: b = '%.2f'%a Out[6]: '21.23' In [7]: b = float('%.2f'%a) 3、'{.%2f}'.format() In [10]: b = '{:.2f}'.format(a) Out[11]: '21.23'
38、python中的sum函数.sum(axis=1)
np.sum([[0,1,2],[2,1,3]],axis=1)
结果就是:array([3,6])
39、Python 字典(Dictionary) setdefault() 函数和get()方法类似, 如果键不已经存在于字典中,将会添加键并将值设为默认值。
dict.setdefault(key, default=None)
参数
key -- 查找的键值。
default -- 键不存在时,设置的默认键值。
demo:
dict = {'Name': 'Zara', 'Age': 7} print "Value : %s" % dict.setdefault('Age', None) print "Value : %s" % dict.setdefault('Sex', None) Value : 7 Value : None
40、Python字符串格式化千分位逗号分隔
print "{:,}".format(99999999) # 结果 # 99,999,999
41、join箭头连接
" —> ".join(all_list)
42、PYTHON删除某目录下的所有文件
import shutil shutil.rmtree(r'G:\test')
会删目录,如果想不删目录的话,就不能用这个函数了,需要自己写代码来递归删除文件夹中的内容,或者还是用这个函数,但是删完以后再新建文件夹。
import shutil shutil.rmtree('要清空的文件夹名') os.mkdir('要清空的文件夹名')
os.remove() 方法用于删除指定路径的文件。如果指定的路径是一个目录,将抛出OSError。
os.removedirs() 方法用于递归删除目录。像rmdir(), 如果子文件夹成功删除, removedirs()才尝试它们的父文件夹,直到抛出一个error(它基本上被忽略,因为它一般意味着你文件夹不为空)。
os.rmdir() 方法用于删除指定路径的目录。仅当这文件夹是空的才可以, 否则, 抛出OSError。
os.unlink() 方法用于删除文件,如果文件是一个目录则返回一个错误。
递归删除目录和文件的方法(类似DOS命令DeleteTree):
import os for root, dirs, files in os.walk(top, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name))
如果想把一个文件从一个文件夹移动到另一个文件夹,并同时重命名,用shutil也很简单:
shutil.move('原文件夹/原文件名','目标文件夹/目标文件名')
43、求和
sum_cnt = np.sum([x[1] for x in list])
44、Python中Numpy库中的np.sum(array,axis=0,1,2...)
c = np.array([[[0, 1, 2,3], [4, 5, 6,7]], [[1, 2, 3,4], [5,6,7,8]]] print( c.sum(axis=0)) print( c.sum(axis=1)) print( c.sum(axis=2))
45、特殊用法:mat (or array).reshape(c, -1); 必须是矩阵格式或者数组格式,才能使用 .reshape(c, -1) 函数, 表示将此矩阵或者数组重组,以 c行d列的形式表示(-1的作用就在此,自动计算d:d=数组或者矩阵里面所有的元素个数/c, d必须是整数,不然报错)
46、存文件
output_file = open("shishi.pkl", 'wb') pickle.dump(data, output_file) output_file.close() input_file = open("shishi.pkl", 'rb') data = pickle.load(input_file)
47、python 判断为空nan, null
对整体的series或Dataframe判断是否未空,用isnull()
eg:
pd.isnull(df1) #df1是dataframe变量
对单独的某个值判断,可以用 np.isnan()
eg: np.isnan(df1.ix[0,3]) #对df1的第0行第3列判断
48、Python中可以用如下方式表示正负无穷:
float("inf"), float("-inf")
49、log1p() 函数
log1p() 函数返回 log(1+number),甚至当 number 的值接近零也能计算出准确结果。
50、python numpy 一维数组转变为多维数组
numpy.array(new_list).reshape(3,3)
51、python生成随机数组
https://blog.csdn.net/healthy_coder/article/details/50502643
52、