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为空的行