#### 1.将Date这个列转换为datetime类型
apple['Date']=pd.to_datetime(apple['Date'])
apple=apple.set_index('Date')#设置date列为行索引
#判定行索引是否有重复,返回True代表数据唯一
apple.index.is_unique
#找出重复的数据:duplicated(),dateframe一行中所有的数据重复则认为是重复数据,重复行返回True
apple['Open'].duplicated()#返回apple中open列里面重复数据,指代第二次出现的为重复,第一次的不认为是重复
apple.sort_index(inplace=True)#对apple的行索引进行升序排列,inplace=True是表示在原表进行排序不生成新的对象
#找到每个月的最后一个交易日
S1=pd.DataFrame(np.arange(len(apple.index)),index=apple.index)#新生成一个dataframe
temp=S1.resample('BM').max()#用每个月的最后一天进行重新采样
apple[apple.index.isin(temp.index)]#表示找出apple表中对应的日期的行
def fin(x):
return x.iloc[-1]
apple.resample('BM').apply(fin)#对apple进行月最后一天工作日采样后返回每月的最后一个日期,apply是利用函数对前面的对象进行应用
#最早的日期和最晚的日期差多少天
print(apple.index.max()-apple.index.min())
#在数据中一共有多少个月
len(apple.resample('M').count())
#将dataframe中某列值下移一个单元格
df['close'].shift(1) -1则为上移一个单元格
#时间索引进行切片操作
df['2010-01':'2020-02']
#取出每个月的第一个/最后一个日期
df.resample('M').first() df.resample('M').last()
#取dataFrame中的某一列可以使用用取得属性的方式获取
euro12.Team
#获得dataframe中的形状可以看多少行多少列
euro12.shape
#取多列数据
euro12[['Team','Yellow Cards','Red Cards']]
#对数据进行排序,按照多个列
displine.sort_values(['Red Cards','Yellow Cards'],ascending=[False,True])
先按照红牌降序排列再按照黄牌升序排列
#对黄牌列求平均值且保留两位小数
round(displine['Yellow Cards'].mean(),2)
#取出分数大于6分的数据
euro12[euro12.Goals>6]
#取出team列中名字以G开头的数据
euro12[euro12.Team.str.startswith('G')>6]
#返回数据的描述性统计值
drinks.groupby('continent').wine_servings.describe()
#同时返回某一列的中位数、平均值,最小值,使用agg进行聚合操作drinks.groupby('continent').spirit_servings.agg(['median','mean','min'])
#缺失值的处理,fillna()
df['Age'].fillna(mean)#用平均值填充
#用apply将对应内容进行替换
def sex_value(Sex):
if Sex=='male':
return 1
else:
return 0
df['Sex'].apply(sex_value)
#采用map函数,内容输入字典,对相应值进行替换
df.Sex=df.Sex.map({'male':1,'female':0})
#定义几个常用的方法
#按照xx对乘客进行分组,计算每组的人数
def xx_group_all(df,xx):
#按照xx对乘客进行分组后 ,每个组的人数
return df.groupby(xx)['PassengerId'].count()
#计算每个组的生还率
def group_passenger_survived_rate(xx):
#按xx对乘客进行分组后每个组的人数
group_all=xx_group_all(df,xx)
#按xx对乘客进行分组后每个组生还者的人数
group_survived_value=xx_group_all(survives_passenger_df,xx)
#按xx对乘客进行分组后,每组生还者的概率
return group_survived_value/group_all
#输出饼图
def print_pie(group_data,title):
group_data.plt.pie(title=title,figsize=(6,6),autopct='%.2f%%'\
,startangle=90,legend=True)
#输出柱状图
def print_bar(data,title):
bar=data.plot.bar(title=title)
for p in bar.patches:
bar.annotate('%.2f%%'%(p.get_height()*100),(p.get_x()*1.005\
,p.get_height()*1.005))
#bar.patches,这里存储了柱状图中柱子的信息,使用bar.annotate()对柱子增加描述性信息,用get_heigeht获取高度,转化为浮点数的百分比,用%将后面的信息进行转化,将x的值左移1.005.高度高1.005
# value_counts探索某列中各元素值出现的次数(只能探索某列的)
# count 计算每列或每行的非NA单元格。
df['第一产业增加值'].value_counts().head()
# unique()函数用于获取Series对象的唯一值。唯一性按出现顺序返回。基于哈希表的唯一,因此不排序
print("唯一值:/n",df['国内生产总值'].unique())
# nunique唯一值得数量
print("/n唯一值的数量:/n",df['国内生产总值'].nunique())
## 探索每一列缺失值数量
print("探索每一列缺失值数量:/n",df.isnull().sum())
# 不是缺失值数量
print("/n不是缺失值数量:/n",df.notnull().sum())
# 每一列求和
print('每一列求和:/n', df.sum())
# 某列逐行累加(可以全部样本每一列都累加)
print(df.cumsum().head())
# 返回 '国内生产总值' 列最大、最小值所对应的索引号
print('/n>>>', df['国内生产总值'].idxmax(), '/n', df['国内生产总值'].idxmin())
# 汇总统计信息,是上面方法的统一
print('/n>>>', df.describe().T)
for (columnName, columnData) in df1.items():
print('Colunm Name : ', columnName)
print('Column Contents : ', columnData.values)
遍历df1中所有列,返回对应的列名及列的内容的列表
# replace允许或不允许对同一行进行多次采样,默认就是False
data = df.sample(n=5, replace=False) # 不放回随机抽样 5 个数据
data
随机抽样
data2 = df['地区'].apply(lambda x: x + 'QQ')
data2.head()
data3 = df.iloc[:, :].apply(np.sum)
data3.head()
#通常用来连接DataFrame对象。默认情况下是对两个DataFrame对象进行纵向连接,
# 当然通过设置参数,也可以通过它实现DataFrame对象的横向连接
df_1 = pd.concat(objs=[df1, df2, df3]) # 合并数据,以行的维度合并
df_1.sample(n=7, replace=False) # 随机不放回抽样 7 个数据
合并数据
# 查找重复值
print('>>>/n', df_1.duplicated(subset=['年份'], keep='first').head())
# 删除重复值
print('>>>/n', df_1.drop_duplicates(subset=['年份'], keep='first', inplace=False).iloc[:, :4])
# 查找重复索引
print('/n>>>', df_1.index.duplicated())
# 第二种方法,两种方法是等效的
df_1.groupby(by=['地区'], as_index=True).年份.agg(['max', 'min', 'median']).head()
as_index为True时将[‘地区’]作为索引输出,默认为false,索引为123
print('/n>>>/n', df1.fillna(method='ffill').head()) # 使用缺失值的前一个值填充(前向填充)
print('>>>/n', df1.fillna(method='bfill').head()) # 使用缺失值的后一个值填充(后向填充)
# 选择任一值大于1000的列
df1.loc[:, (df1>10000).any()]
# 选择所有值大于1000的列
df1.loc[:, (df1>1000).all()]
df_1.loc[:, df_1.isnull().any()] # 选择含 NaN值的列
df_1.loc[:, df_1.notnull().all()] # 选择不含NaN值的列
#### query和filter
在使用pandas进行数据分析时,经常遇到需要过滤信息的场景,此时我们可以用到2种函数,query和filter。
#### query函数
query函数我认为类似sql语言中的where,可以对dataframe中的特定column进行筛选。具体语法如下:
df.query('列名 判断 值'),如df.query('column1 > 2 and column 2<1')
df1.query('在岗职工平均工资>5000 and 国内生产总值>16538' )
等于
df[df[列名] 判断 值],如 df[df[column1]>2 & df[column2]<1]
#### filter函数
filter常规用法,在pandas说明里很好找到:
DataFrame.filter(items=None, like=None, regex=None, axis=None)
#items对列进行筛选#regex表示用正则进行匹配#like进行筛选#axis=0表示对行操作,axis=1表示对列操作
# 选择指定的列,类似于 df[['某列', '某列']]
df_1.filter(items=['地区', '年份']) # 选择指定的列
df_1.filter(like='产业', axis=1) # 选择含有 "产业" 的列