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中写内容不覆盖以前内容用法

  两种方法选一种:

  1. df.to_csv, 参数mode='a'表示追加

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

 

posted on 2017-06-08 14:09  小鸟的士林  阅读(1880)  评论(0编辑  收藏  举报

导航