df = pd.read_csv('data/train.csv', encoding='utf-8',header=None,names=['timestamp','value','label'])
df.to_csv('data/data.csv',header=None,index=None)
读取数据之后,要先对数据有个初步了解,有空值的先处理空值
df.head()
df.info()
df.describe()
# 统计各种标签的数量
df['label'].value_counts()
# 筛选出有缺失值的列
df.isnull().any()
# 筛选出有缺失值的行
df.isnull().T.any()
查看两列数据是否存在关系,画两者的关系图
import seaborn as sns
sns.residplot(df['A'],df['B'])
# 另一种方式
sns.regplot(x='A',y='B',data=df)
plt.ylim(0,)
# 一图两线
ax1 = sns.distplot(df['price'],hist=False,color="r",label="Actual Value")
sns.distplot(Yhat,hist=False,color="b",label="Fitted Value",ax=ax1)
df.rename(columns={
"A": "姓名", "B": "年龄",inplace=True)
df['A'].sum() # 求和
df['A'].max() # 求最大值
df['A'].min() # 求最小值
df['A'].mean() # 求均值
df['A'].std() # 求标准差
df['A'].median() # 求中位数
df['value'] = df_train['value'].map(str)
# 效率下者比上者高70倍以上
df['value'] = df_train['value'].astype(int)
df.drop(["A", "B"], axis=1, inplace=True)
df[2:3]
df['20180709':'20180710']
df[df.A > 3]
#
df.loc['20180711']
df.loc[:,['B','C']]
df.loc[(df['A']>1) & (df['B']=='male'),:]
#
df.iloc[1:3, 2:4]
df.iloc[[0, 2], 2:4]
# 查看某一行某一列的值
df1 = df[df["id"]=="2301"]
value = df1.iloc[0]["A"]
df.loc[index, 'B'] = 1
df.loc[df.A>0, 'B'] = 1
df.iloc[2, 2] = 1
df.A[df.A > 3] = 1
df.drop(index=del_indexs, axis=0, inplace=True)
# 删除NaN值,how:'any'(只要含有NaN数据就丢弃),'all'(所有数据都为NaN时丢弃)
df.dropna(axis=1, how='all',inplace=True)
# 删除某个字段为空的数据
df.dropna(subset=['A'],inplace=True)
# 全部填充
df.fillna(value=0,inplace=True))
# 对不同列填充不同的值
df.fillna({
"A":0,"B":1})
# method:ffill(用前面的数进行填充),bfill(用后面的值填充)
df.fillna(method='ffill')
# 用均值填充
df.fillna(df["score"].mean(),inplace=True)
# 保留两位小数
df["A"] = round(df["A"], 2)
# 百分比显示
df["ratio"] = df["ratio"].apply(lambda x: '%.2f%%' % (x * 100))
# 这种方法会将math列中非0元素变为NaN
df1["math"] = df1["math"].map({
0:100})
df1.loc[df1["math"]==0,"math"] = 100
# 推荐这种方式,效率是上者的两倍以上
df.replace(to_replace=0, value=100)
# 删除完全重复的行
df.drop_duplicates()
# 删除字段A重复的数据,保留第一行
df.drop_duplicates(subset = 'A')
# 删除字段A重复的数据,保留最后一行
df.drop_duplicates(subset = 'A',keep='last')
ids = np.array(df["id"]).tolist()
df2 = df.copy(deep=True)
df = df.loc[df["remarks"].str.contains('测试')]
df_list = df.to_dict('records')
# join:'outer'(默认,取并集), 'inner'(取交集),以下为按列合并,数据行取交集
# ignore_index:是否重排行索引
df = pd.concat([df1, df2], join='inner', axis=1, ignore_index=True)
# 纵向合并
df = pd.concat([df1, df2], axis=0)
# how:'inner', 'outer', 'left', 'right'
pd.merge(df3, df4, on=['key1', 'key2'], how='right')
注意问题:
1、有时候merge会出错,主要由于数据中有重复数据,要先去掉重复数据再merge
df.drop_duplicates(subset='game_id', keep=False, inplace=True)
2、合并之后,最好先删除之前的索引,方便以后的计算
df.reset_index(drop=True, inplace=True)
df["rank"] = df["A"].rank(ascending=False, method='min')
排名列数据格式为float64。
method有四种类型:“first”: 根据值在数组中出现的顺序进行排名 ,
“min”: 用整个分组的最小排名 ,“max”: 用整个分组的最大排名 ," average ":默认方式,平均排名
df = df.sort_values(by=["B"],ascending=[False])
df_group1 = df1.groupby(by=["class_id"], as_index=False).apply(max)
df_group2 = df1.groupby(by=["class_id"])[["math","english"]].apply(max).reset_index()
df_sum = df.groupby(by=["A","B"], as_index=False)["math", "english", "chinese"].sum().reset_index()
df_count = df.groupby(by=["A","B"], as_index=False)["id"].count().reset_index()
df["cumsum"] = df["A"].groupby(by=["id"], as_index=False).cumsum().reset_index()
注:在分组统计时,如果某列含有空值(“”),会造成对该列分组统计出现问题。
解决方式:再分组统计之前先对空值进行替换。
df.replace("",0,inplace=True)
groupby分组默认会把分组依据列变成索引,可以用reset_index方法重置或者说取消索引,将它保留在列的位置,维持DataFrame格式,方便后续匹配。
切分常用于一维数组的分类和打标
df["label"] = pd.cut(x = df['A'],bins = [0,60,80,90,100],right = False,labels = ['不及格','及格','良','优'])
def f(x):
if x == 'male':
return '男'
if x == 'female':
return '女'
df["sex"] = df["sex"].apply(f)
# 还可以采用以下两种方式
df["sex"] = df["sex"].apply(lambda x: '男' if x == 'male' else '女')
df["sex"] = df["sex"].map({
'male': '男'})
注:map比apply效率要高。简单的替换优先选用map,复杂操作需要使用apply配合编写的规则函数来实现。
apply传参
def circle_rate(df,arg1,arg2,arg3):
df1 = df[arg1]
df2 = df[arg2]
df3 = df[arg3]
return df1 - df2 if df2==df3 else (df1-df2)/(df2-df3)
df["day_bef"] = df.apply(circle_rate, axis=1, arg1="anzhuang", arg2="anzhuang_bef", arg3="anzhuang_bef_bef")
透视表函数
df_pivot = pd.pivot(df, index="cs", columns="rate").reset_index()
df_pivot_table = pd.pivot_table(df,index=["A","B"],columns="rate",aggfunc="count").reset_index()
#画Heatmap图
df_pivot = pd.pivot(df, index="cs", columns="rate")
plt.pcolor(df_pivot ,cmap='RdBu')
plt.colorbar()
plt.show()
pivot与pivot_table区别:
pivot要求行与列的交叉值的索引必须唯一,否则会报错。
pivot_table会将重复索引的值求均值。