Dataframe中遇到的问题
1、为某个dataframe添加index
factor_exposed_matric.index = cols
2、drop某一列
删除pandas DataFrame的某一/几列:
方法一:直接del DF['column-name']
方法二:采用drop方法,有下面三种等价的表达式:
1. DF= DF.drop('column_name', 1);
2. DF.drop('column_name',axis=1, inplace=True)
3. DF.drop([DF.columns[[0,1, 3]]], axis=1,inplace=True) # Note: zero indexed
注意:凡是会对原数组作出修改并返回一个新数组的,往往都有一个 inplace可选参数。如果手动设定为True(默认为False),那么原数组直接就被替换。也就是说,采用inplace=True之后,原数组名(如2和3情况所示)对应的内存值直接改变;而采用inplace=False之后,原数组名对应的内存值并不改变,需要将新的结果赋给一个新的数组或者覆盖原数组的内存位置(如1情况所示)。
3、查询DataFrame每一列的类型
print("in", industry_factor.dtypes)
4、为DataFrame添加新的一行数据
headers = [] for i in range(0, 28): headers.append('industry' + str(i+1)) headers.append("ticker") file_object.write(','.join(headers) + '\n') matrix_data = pd.DataFrame(columns=headers, dtype=int)#step1 row2 = [] for i in range(0, 28): row2.append(0) for gp_code in gp_code_list: index = index_of_industry(gp_code, industry_name_aa, industry_collection_aa) row2[index] = 1 row_tmp = row2 row_tmp.append(gp_code) # print('row',row) # print(row_tmp) # print(headers) row_tmp = pd.DataFrame([row_tmp],columns=headers, dtype=int)#step2 # print(row_tmp) matrix_data = matrix_data.append(row_tmp, ignore_index=True)#赋值step3 row2.pop() row2[index] = 0
5、Dataframe修改元素的值
DATAFRAME中使用iat[1,0]和iloc[0,1]对元素进行修改。 a = [("hahaha",1),("lalala",2),("cacaca",6)] b = padas.DataFrame(a) b.iat[1,0] = 1.0 将位置横竖坐标为1,0的元素改为值为1.0。
6、list查询某元素的索引
def index_of_industry(gp_code, industry_name_aa, industry_collection_aa): gp_code_in_name_aa = '' try: gp_code_in_name_aa = industry_name_aa.get(gp_code[0:6])[0] #print("gp_code_in_name_aa",gp_code_in_name_aa) index = industry_collection_aa.index(gp_code_in_name_aa) return index # for industry_name in industry_collection_aa: # if industry_name == gp_code_in_name_aa: # return index # index += 1 except Exception as e: print('异常:', gp_code,gp_code_in_name_aa,industry_collection_aa,industry_name_aa) return 0
7、查询DataFrame第n列的列名
print('cols',df_matrix.columns.tolist()[2])#查询第几列的的名字
8、DataFrame用iat修改元素
for gp_code in gp_code_list: index = index_of_industry(gp_code, industry_name_aa, industry_collection_aa) # print('1',df_matrix['ticker']==gp_code) # 根据行列找到元素的位置 df_matrix.iat[row,index] = 1 row += 1 print('df_matrix',df_matrix)
9、高效实用DataFrame
# 提高50倍,思路:先创建好矩阵,代替极度耗时的一行一行的拼接,然后去一行一行修改要修改的元素。
headers2 = []
for i in range(0, 28):
headers2.append('industry' + str(i + 1))
matrix = np.zeros((len(gp_code_list), 28))
df_matrix = pd.DataFrame(matrix,columns=headers2 , dtype=np.int64)
df_gp_codes = pd.DataFrame(gp_code_list,columns=['ticker'])
df_matrix = pd.concat([df_matrix,df_gp_codes],axis=1)
row = 0
#根据横纵坐标修改元素
for gp_code in gp_code_list:
index = index_of_industry(gp_code, industry_name_aa, industry_collection_aa)
# print('1',df_matrix['ticker']==gp_code)
# 根据行列找到元素的位置
df_matrix.iat[row,index] = 1
row += 1
print('df_matrix',df_matrix.dtypes,df_matrix)
10、list的append方法没有返回值,不能直接打印
factor2 = [0] * 32 #print(factor1.append('000002.SZ'))#None factor1.append('000002.SZ') print(factor1)#正常输出33个元素的list
11、词典转化为json的dumps和loads
# coding: utf-8 import json from collections import OrderedDict text = OrderedDict() # 有序字典 text['c']=1 text['b']=2 text['d']=4 # 普通字典 text1 = {} text1['d']=4 text1['c']=4 text1['e']=4 print('text1',text) # 将字典转换为json格式 du = json.dumps([text] ,sort_keys = True)#字符串 print('du',du) metadata = json.loads(du,encoding='utf-8',object_pairs_hook=OrderedDict)#list print('metadata',metadata) du2 = json.dumps([{'a':11,'b':22}])#转换为标准json du2 = json.dumps([{"a":11,"b":22}])#转换为标准json print('du2',du2) #text1 OrderedDict([('c', 1), ('b', 2), ('d', 4)]) #du [{"b": 2, "c": 1, "d": 4}] #metadata [OrderedDict([('b', 2), ('c', 1), ('d', 4)])] #du2 [{"b": 22, "a": 11}]
F_series = json.dumps([OrderedDict(F_series)])# 强制转化Series为有序字典再转为json字符串
12、DataFrame转矩阵再转list
import numpy as np import pandas as pd arr = np.arange(12).reshape([3,4]) print(arr) df_arr = pd.DataFrame(arr) print('df_arr',df_arr) matrix = df_arr.values print('matrix',matrix)# 矩阵无逗号隔开 arr2 = matrix.tolist() # 数组有逗号隔开 print('arr2',arr2) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] # df_arr 0 1 2 3 # 0 0 1 2 3 # 1 4 5 6 7 # 2 8 9 10 11 # matrix [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] # arr2 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
13、词典拼接json返回格式
result = OrderedDict() result['errno'] = 1 result['error'] = 'suceess' data = OrderedDict() index = 0 print(sorted(all_factor_list.keys())) for date in sorted(all_factor_list.keys()): data.setdefault(date,{})['regression_coefficient'] = 2 if index < 1: index += 1 continue data.setdefault(date,{})['regression_coefficient'] = 2 data.setdefault(date,{})['return_rate_errors'] = 3 result['data'] = [data] print('all_factor_list',json.dumps(result)) # { # "errno": 1, # "error": "suceess", # "data": [{ # "2016-03-01": {"regression_coefficient": 2}, # "2016-03-02":{"regression_coefficient": 2, "return_rate_errors": 3 # } # }] # }
14、指定位置插入一列
factor_exposed_matric.insert(0,'fund_code',row_index)
分割完毕,现在要把各列重新插入,除在最右侧插入用标签直接创建外,其他列用.insert()方法进行插入。
In [6]:
table.insert(0,'date',date)
table
Out[6]:
date spring autumn
0 2000 12.233881 15.692383
1 2001 12.847481 14.514066
2 2002 13.558175 15.699948
3 2003 12.654725 15.661465
4 2004 13.253730 15.209054
5 2005 13.444305 16.622188
6 2006 13.505696 15.497928
7 2007 13.488526 15.817014
8 2008 13.151532 15.729573
9 2009 13.457715 18.260180
10 2010 13.194548 15.426353
11 2011 14.347794 14.176580
12 2012 13.605087 14.717968
13 2013 13.027908 16.203455
14 2014 12.746682 14.736768
15 2015 13.465904 12.442437
14、pandas往to_csv和to_excel中写内容不覆盖以前内容用法
两种方法选一种:
-
df.to_csv, 参数mode='a'表示追加
-
df.to_excel,在写入之前把df的值拼在一起写入,比如原来的数据是df1, 要写入的数据是df2则 pandas.concat([df1, df2]).to_excel()
15、DataFrame删除索引修改列和索引
删除行索引重排: ser = ser.reset_index(drop = True) df = df.reset_index(drop = True) 修改索引和列: ser.index = ['a','b'] ser.columns = ['a','b'] ------------------------------------------ 直接修列索引: df = pd.DataFrame(df,columns = ['One','Two','Three'])
16、把只有1列的dataframe直接转为有序词典
u = pd.DataFrame(return_rate_error.tolist(), columns=["return_rate_error"],index=index_list) print(u) u = OrderedDict(u['return_rate_error']) print(u)
17、求两个dataframe根据某一列的交集
import pandas as pd c1 = {'001.SZ':1,'002.SZ':2,'003.SZ':3,'004.SZ':4} c2 = {'001.SZ':1,'002.SZ':2,'003.SZ':3,'005.SZ':4} close_price = pd.DataFrame([['001.SZ','002.SZ','003.SZ','004.SZ'],[1,2,3,4]],index=['index','value']) close_price2 = pd.DataFrame([['001.SZ','002.SZ','003.SZ','005.SZ'],[1,2,3,5]],index=['index','value']) close_price3 = pd.merge(close_price.T,close_price2.T,on='index') print(close_price3) # index value_x value_y # 0 001.SZ 1 1 # 1 002.SZ 2 2 # 2 003.SZ 3 3
18、Series类型在计算dot,该序列可转置也可不转,结果一样
# 两者等价 rt_ep1 = (df_pre_factor_list['net_rate'].T.dot(df_pre_factor_list['ep']))*industry_regression_coefficient['ep'] rt_ep2 = (df_pre_factor_list['net_rate'].dot(df_pre_factor_list['ep']))*industry_regression_coefficient['ep']
19、丢弃出现nan为空的行