乐趣区

Python之pandas

dataframe 和 series 操作

1、取 dataframe 数据

1) iterrows()

for index_, row in df1.iterrows():
    print(index_)
    print(row, row.values[0])

iterrows()按行遍历 dataframe 或 series,返回两个元素:行索引和行值,其中行值为 Series 格式,可以根据 list 索引取具体的数值。
结果:

2) itertuples()

itertuples 为每一行产生一个 namedtuple,并且行的索引值作为元组的第一个元素,pandas 类型。

for nametuple in df1.itertuples():
        print(nametuple)
        print(nametuple[0], type(nametuple))

3) dataframe 按某列的值取数据

temp_df[temp_df.c1 == 'aa']['c2']

dataframe 对象 temp_df 的 c1 列值为 aa 时 temp_df 的 c2 列的值;

4) dataframe 根据列值取行索引

temp_df[temp_df.c1 == 'aa'].index.to_list()

temp_df 的 c1 列值为 aa 时,temp_df 的行的索引;

5) dataframe 根据行索引和列名修改 dataframe 的值

final_result.loc[10, 'c1'] = abc

将 final_result 的 10 行 c1 列的值改为 abc;

6) dataframe 根据列名取值

sorted(list(set(pre_result['c3'].to_list())))

返回 list 格式,set()去重,list()改回 list 格式,sorted()排序;

7) 取 dataframe 的部分列

df_after[['c1', 'c3', 'c6']]

8) dataframe.loc[0]——根据数字型行索引的值取值,

print(retemp.loc[0])
retemp:
    asset_return  asset_vol
0             1          2
1            11         12
output:
asset_return    1
asset_vol       2

9) dataframe.iloc[1]——根据行顺序取值,取第 i 行,从 0 开始

retemp:
           asset_return
asset_vol             
b                    a
ee                  dd
output:
asset_return  dd
asset_vol     ee

2、索引

1) 修改列名或索引名

df_after = df_after.rename(columns={base_type: 'values'})

修改列名 base_type 为’values’。

2) dataframe.set_index(‘return’)——将 return 列的值作为新的行索引

print(retemp, '\n', retemp.set_index('return'))
output:
        return asset_vol
0            a         b
1           dd        ee 

           return
asset_vol    
b            a
ee           dd 

3) dataframe.reset_index()

重置行索引为数字型索引, 参数 drop=True 时丢失原索引列,参数 inplace=True 时,修改原 df,为 false 时,返回新的 df

output:(drop=False)
   index    return      vol
0      0            a         b
1      1           dd        ee
output:drop=True
        return      vol
0            a         b
1           dd        ee
retemp:
                return
vol             
b                    a
ee                  dd 
print(retemp.reset_index(inplace=False))
print(retemp)
output:inplace=False 时返回的结果
   index return vol
0      0            a         b
1      1           dd        ee

原 retemp 没有改变

            return   vol
0            a         b
1           dd        ee

3、drop_duplicates(self, keep=’first’, inplace=False)

删除 series 的重复项

4、dataframe 的 apply 方法

5、np.asarray(a, dtype=None, order=None)

将输入转化为数组

6、dataframe 指定的列做运算,列名要一样

res_df['q'] = res_df['q'] / df['q']

res_df 和 df 的 q 列相除

7、判断 dataframe 的数据是否为 NaN

temp_df[temp_df.c1 == cc_]['c2'] is np.NaN

8、pd.concat()

拼接 dataframe,列索引可以不一样,拼接后的结果会保留原 df 的行索引,当两个 df 的列数量不一样时,会填充 NaN

df = pd.concat([df1, df2])
input:
      Q1    Q2    
0  asset  path    
1  asset  path    
2  asset  path    
3  asset  path    
       Q1         Q2           Q3
0  quater  0.6641355  0.664235635
1  quater  0.6641355  0.664235635
2  quater  0.6641355  0.664235635
3  quater  0.6641355  0.664235635
4  quater  0.6641355  0.664235635    
output:
       Q1         Q2           Q3
0   asset       path          NaN
1   asset       path          NaN
2   asset       path          NaN
3   asset       path          NaN
0  quater  0.6641355  0.664235635
1  quater  0.6641355  0.664235635
2  quater  0.6641355  0.664235635
3  quater  0.6641355  0.664235635
4  quater  0.6641355  0.664235635

9、设置打印的数据小数点位数

pd.set_option('precision', 10)

10、字典转 dataframe,设置数据格式

data1 = {'Q1': ['0.1', '0.2', 0.3],
            'Q2': [1, 2, '3']}
df1 = pd.DataFrame(data1, dtype=np.float)

11、df.shift(n)

dataframe 向下平移 n 行

12、操作文件

(一)to_excel()可以选择要保存的 sheet

writer = pd.ExcelWriter('df2.xlsx',)
df1.to_excel(writer, index=False, sheet_name='aaa')

(二)to_csv(),mode=’a’——设置写入的模式:添加

一次写入

df1.to_csv(path_or_buf=file_name, index=False, mode=’a’)

分行写入,newline=”——去空行
with open("test0.csv", "a+", newline='') as csvfile:
    writer = csv.writer(csvfile, dialect='excel')
    # 先写入 columns_name
    writer.writerow(['Q1', "Q2", "Q3", "Q3"])
    for i in range(len(column1)):
    # 写入多行用 writerows
    writer.writerow([column1[i], column2[i], column3[i], column4[i]])

(三)读 csv 文件为 dataframe,header=None: 表示 csv 文件中不包含列名,names=[]:设置 df 的列名

df_after = pd.read_csv(filepath_or_buffer=file_name, header=None, names=['c1', 'c2', 'c3', 'c4'])

13、pivot 函数

对 dataframe 行列互换,可以接收三个参数,分别是 index、columns 和 values,其中 index 用来指定转换后 DataFrame 对象的纵向索引,columns 用来指定转换后 DataFrame 对象的横向索引或者列名,values 用来指定转换后 DataFrame 对象的值。

14、pd.merge()函数

merge(left, right, how='inner', on=None, left_on=None, right_on=None,
          left_index=False, right_index=False, sort=False,
          suffixes=('_x', '_y'), copy=True, indicator=False,
          validate=None)

作用:拼接两个 dataframe 对象,可以通过参数 left,right,on,how,sort 等参数设置多种拼接方式。
left/right: 设置待拼接 dataframe 的左右顺序;
on: 设置拼接 dataframe 的连接键,必须是待拼接的两个 dataframe 中同时存在的,可以是一个列表,表示同时按多列拼接;
left_on=/ right_on=: 分别设置待拼接的两个 dataframe 的连接键,可以不同;
how: 设置拼接方式,’left’, ‘right’, ‘outer’, ‘inner’。
sort: 按字典顺序通过连接键对结果 DataFrame 进行排序。

15、Pandas 聚合和分组

15.1 GroupBy

1) 使用 groupby 对 dataframe 按照列名、索引分组

然后对分组的数据求均值、方差等计算。

Grouped = df.groupby[‘column_name’]

变量 grouped 是一个 GroupBy 对象,它实际上还没有进行任何计算
同时传入多个对象:对 df 按照 column_2 和 column_3 两级分组,然后求列 column_1 的均值。

Grouped = df[‘column_1’].groupby([df[‘column_2’],df[‘column_3’]]).mean()

使用 size()方法查看每个分组的数据大小。

2) GroupBy 对象支持迭代

产生一组二元元组(由分组名和数据块组成),其中数据块的索引与原 dataframe 一致。

for name_, group_df in df_res.groupby('path'):
        print(name _)
        print(group_df)

对于多重键的情况,元组的第一个元素将会是由键值组成的元组:

for (k1, k2), group_df in df.groupby(['key1', 'key2']):
     print(k1, k2)
     print(group_df)

3) groupby 默认是在 axis= 0 上进行分组的,通过设置也可以在其他任何轴上进行分组

grouped = df.groupby(df.dtypes, axis=1)

4) 分组信息可以是字典

          a         b         c         d         e
1     0.306336 -0.139431  0.210028 -1.489001 -0.172998
2   0.998335  0.494229  0.337624 -1.222726 -0.402655
3     1.415329  0.450839 -1.052199  0.731721  0.317225

mapping
{‘a’: ‘group1’, ‘c’: ‘group2’, ‘b’: ‘group1’, ‘e’: ‘group1’, ‘d’: ‘group2’, ‘f’: ‘group3’}
将 dataframe 的列通过字典的键值对映射,可以将多列映射到同一个键值,然后传入字典根据键值分组。

by_column = df1.groupby(mapping, axis=1)
by_column.sum()
     group2       group1
1    -1.278973 -0.006092
2  -0.885102  1.089908
3     0.731721  1.732554
退出移动版