2021-06-04

dataframe数据的选取和操作

import pandas as pd
import numpy as np
import cx_Oracle
con =cx_Oracle.connect('scott/123@localhost:1521/orcl',encoding='utf-8')
sql =f''' SELECT e.empno, e.ename, e.sal, e.deptno
          FROM emp e
        UNION ALL
        SELECT deptno, NULL, AVG(e.sal), NULL
          FROM emp e
         GROUP BY e.deptno '''
# 注意在转化后的df列名中,不同的环境可能大小写不同
df =pd.read_sql(sql,con)
df
# 注意存在None, 也存在NaN 的值

print(df.info())
print(df.head(5))
print("=========================")
print(df.isnull().sum())

# 删除某列项的空值
df.dropna(subset=['ENAME'],inplace=True)  
# df.dropna(inplace=Ture) ,删除所有空值项
print(df.isnull().sum())
print(df.info())

# 删除重复,subset默认是整个表
df.drop_duplicates(inplace=True)
#删除某列
#df.drop(subset='user_geohash',axis=1,inplace=True)

# 列的重命名
df =df.rename(columns={'EMPNO':"员工编号",'ENAME':"员工姓名"}) #当小写empno,ename时获取不到数据

# 索引 df[], loc, iloc ,ix at等
# 构造一个df
data = {'name': ['Joe', 'Mike', 'Jack', 'Rose', 'David', 'Marry', 'Wansi', 'Sidy', 'Jason', 'Even'],
        'age': [25, 32, 18, np.nan, 15, 20, 41, np.nan, 37, 32],
        'gender': [1, 0, 1, 1, 0, 1, 0, 0, 1, 0],
        'isMarried': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
df = pd.DataFrame(data, index=labels)
df

# 选取行的三方式:
df[0:2]     # 1.整数索引切片
df['a':'d'] # 2.标签索引切片 
df[(df['age']>30) | (df['isMarried']=='yes')] # 3.布尔数组。

# 列选取
df['name'] # 多列为 df[['name','age']]

# df.loc[]只能使用标签索引
# 选取单行 和 列
df.loc['a',:]            # 选列为:df.loc[:, 'name']
# 选取多行 
df.loc[['a','b','c'],:]  # 选列为:df.loc[:, ['name','age','isMarried']]
# 选取a到d的行
df.loc['a':'d', :]       # 从某列到某列: df.loc[:,'name':'gender']
# 选取 age大于30 的行
df.loc[df['age']>30,:]

# 同时对行和列进行筛选
# 输出年龄大于30的人的姓名和年龄
df.loc[df['age']>30,['name','age']]
# 输出 Mike 或 Marry 的姓名和年龄
df.loc[(df['name']=='Mike') |(df['name']=='Marry'),['name','age']]          



# df.iloc[]只能使用索引
# 选取单行 和 列
df.iloc[0,:]  # 选列为:df.iloc[:, 0]
# 选取多行 
df.iloc[:3,:] # 前三行     # 前三列:df.iloc[:,:3]
# 第二,第四,第六行
df.iloc[[1,3,5],:]  # 选列为:df.iloc[:, [1,3,5]]
# 选取某行到 某的行
df.iloc[1:3, :]  # 从某列到某列: df.loc[:,1:3]

# 同时对行和列进行筛选
#选取第2行的第1列、第3列
df.iloc[1, [0,2]]
#选取前3行的前3列
df.iloc[:3, :3]

# df.ix[]既可以通过整数索引,也可以通过标签索引,df.ix[]是df.loc[]和df.iloc[]的功能集合
#选取第3行的name数据
df.ix[2,'name']
#选取a行、c行的第1列,第2列和第4列数据
df.ix[['a','c'], [0,1,3]]

#单元格选取  df.at[]
# 某年毕业的人
df.at['b','name']
#选取第2行第1列
df.iat[1,0]

# df.where(cond, other=nan, inplace=False, axis=None, level=None,errors=‘raise’, try_cast=False, raise_on_error=None) 
# 如果 cond 为真,保持原来的值,否则替换为other, inplace为真标识在原数据上操作,为False标识在原数据的copy上操作
df.where(df['SAL']<2000) # 产生新的df,满足条件的全部用NaN填充
df.where(df['SAL']<2000,100)# 将小于2000的行,全部替换成100

# 当df每一列的值为数字时可以整体操作
df_num = pd.DataFrame(np.arange(10).reshape(-1, 2), columns=['A', 'B'])
df_num.where(df_num%2==0,-df_num)
# df.where()=和df.mask 相反
df_num.where(df_num%2==0,-df_num)==df_num.mask(~(df_num%2==0),-df_num)

# df.agg()聚合,max,min,sum,mean,
df=pd.DataFrame([[1,2,3,4],[11,22,33,44],[111,222,333,444],[1111,2222,3333,4444]],columns=['col1','col2','col3','col4'],)#列名
print(df)
# 列的聚合
df['col1'].mean()
df.agg(['max','sum','mean'])
# 行的聚合
# 多列的不同聚合,结果没有的填NaN
df_columns=df.agg({'col1':['sum','min'],'col2':['max','min'],'col3':['sum','min']})

# 对列操作
df['col1']*5
df['col1'] * df['col2'] # 列之间的相互操作
# 对行操作
df.iloc[0,:]*5

# groupby()分组
df.groupby('DEPTNO').sum()          # 聚合了所有能聚合的列
df['SAL'].groupby(df['DEPTNO']).sum()# 只聚合了 SAL 的列
df.groupby(['DEPTNO','ENAME']).sum()
df['SAL'].groupby([df['DEPTNO'],df['ENAME']]).sum()

#按自定义分组
#Series 分组
mapping={‘a’:‘red’,‘b’:‘red’,‘c’:‘blue’,‘d’:‘blue’,‘e’:‘red’,‘f’:‘orange’}
map_series=pd.Series(mapping)
people.groupby(map_series,axis=1).count()
#array分组
states=np.array([‘Ohio’, ‘California’, ‘California’, ‘Ohio’, ‘Ohio’])
years=np.array([2004,2005,2006,2005,2006]) 
df[‘data1’].groupby( [states,years] ).mean()
#字典分组
mapping={‘a’:‘red’,‘b’:‘red’,‘c’:‘blue’,‘d’:‘blue’,‘e’:‘red’,‘f’:‘orange’}
by_column=people.groupby(mapping,axis=1).sum() #指定axis=1,表示对列数据进行聚合分组

#函数分组
#例如:传入len函数(可以求取一个字符串长度数组),实现根据字符串的长度进行分组
people.groupby(len).sum() #将字符串长度相同的行进行求和

#分组键为函数和数组、列表、字典、Series的组合
#引入列表list[ ] 将函数跟数组、列表、字典、Series混合使用作为分组键进行聚合,因为任何东西最终都会被转换为数组
key_list=[‘one’,‘one’,‘one’,‘two’,‘two’] #自定义列表,默认列表顺序和df的列顺序一致
people.groupby([ len,key_list ]).min()

#分组键为具有多重列索引df 的列索引层次
hier_df.groupby(level=‘cty’,axis=1).count() #利用参数level,指明聚合的层级


# 常用的函数
# 读取上一行的数据,若参数设定为3,就是读取上三行的数据;若参数设定为-1,就是读取下一行的数据;
df['昨天收盘价'] = df['收盘价'].shift(-1) 
# 该列的累加值
df['成交量_cum'] = df['成交量'].cumsum()  
# 该列的累乘值,此处计算的就是资金曲线,假设初始1元钱。
print((df['涨跌幅'] + 1.0).cumprod())  
# 排序
df.reset_index(inplace=True)
print(df.sort_values(by=['交易日期'], ascending=1))  # by参数指定按照什么进行排序,acsending参数指定是顺序还是逆序,1顺序,0逆序
print(df.sort_values(by=['股票名称', '交易日期'], ascending=[1, 1]))  # 按照多列进行排序

print(df.empty)  # 判断一个df是不是为空,此处输出不为空
print(pd.DataFrame().empty)  # pd.DataFrame()创建一个空的DataFrame,此处输出为空
print(df.T)  # 将数据转置,行变成列,很有用

# rolling(最近n天的均值)
print(df['收盘价'].rolling(3).max())
#使用expanding操作(从一开始至今的均值)
df['收盘价_至今均值'] = df['收盘价'].expanding().mean()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值