1.数据导入
df=pd.read_csv('Pokemon.csv',encoding="ISO-8859-1")
df.head()
2.查看数据
df.shape
df.shape[0]
df.shape[1]
df.columns #列名
df.index #行名
df.dtypes
df.head()
df.tail()
df.sample()
df.describe()
pd.set_option('max_colwidth',8) #设置每一行的最大宽度,恢复原设置方法
pd.reset_option('max_colwidth')
loc操作与iloc loc通过label定位;iloc通过position定位
df.loc[[0,5],['名称','生命点数']]
df.iloc[0:10,[0,1]]
df[:3]
3.数据筛选与操作
df[df['综合能力']>400].head()
df[df['世代数']==1]
df.insert(4,'能力600',df['综合能力']>=600)
4.读取数据
pickle文件,可以将python中的数据类型进行序列化 compression参数指定了压缩类型,‘zip’, ‘gzip’, ‘bz2’, ‘zstd’
pandas.read_pickle(filepath_or_buffer, compression='infer', storage_options=None)
5.处理数据
(1)取特定的行列
利用标签取列:
data['xxx']
data.at #访问单个值
data.loc['行名','列名'] #访问值组
data.loc[['A行','B行']] # 取多行
(2)对需要的行列进行处理
时间处理
#转换回日期格式,默认是毫秒
data['time'] = pd.to_datetime(data['time'],unit='s')
#生成一个时间戳
now = pd.Timestamp.now()
某一列数据进行处理
data['xxx'] = ['这里用一个列表表达式']
data['xxx'] = data['xxx'].apply(lamdba x: function(x))
对于字符串的处理
#去掉首位的a
data['a'] = data['a'].str.strip('a')
# 替换
data['a'] = data['a'].str.replace('a','b')
将特定的列拆分后合并
data = pd.concat([data, data['tempvaluearray'].str.split(',', expand=True)], axis=1).drop('tempvaluearray', axis=1)
pd.concat()#可以按照指定的轴将dataframe或者series拼接,而merge只能拼接两个表
axis #0:上下拼接 1:左右拼接
#drop()的参数axis在删除特定的一行为1
批量修改列名称
data.rename(columns=dic)#可以写一个字典进行替换
计算时保留小数
'%.3f'%0.0065 #保留3位小数
lambda x:'%.3f'%((int(x)-1000)/1000))
调整列顺序
#先取出来再插入
A = data['A']
data.drop(labels=['A'],axis = 1,inplace=True)
data.insert(0, 'A', A)
一个字符串划分的函数
# 对于数据为[12,23,45,12]类似的数据,其中不能是字符串
def split_col(data, columns):
"""拆分成列
:param data: 原始数据
:param columns: 拆分的列名
:type data: pandas.core.frame.DataFrame
:type columns: list
"""
for c in columns:
new_col = data.pop(c)
max_len = max(list(map(len, new_col.values))) # 最大长度
new_col = new_col.apply(lambda x: x + [None]*(max_len - len(x))) # 补空值,None可换成np.nan
new_col = np.array(new_col.tolist()).T # 转置
for i, j in enumerate(new_col):
data[c + str(i)] = j
去重
df_unique = df.drop_duplicates(['A'], keep='last') # 根据A去重只留下最后一次出现的
隔行取数据
方法1:每隔20行取数,把每20行的id取出来
a=[]
for i in range(0,len(df),20):
a.append(i)
new_df= df.iloc[a]
方法2:直接调用read_csv()里的参数skiprows
df = pd.read_csv('test.csv',header = None,skiprows=lambda x: x > 0 and x % 20 != 0)
df
6.遍历和求值
-
遍历
for name,group in grouped_single: print(name) display(group.head())
-
组内求均值,最大值,最小值等等
df.groupby('A')['B'].mean()
- agg自定义内置函数
df.groupby('A')['B'].agg(fun())
-
整合(Aggregation)——即分组计算统计量(如求均值、求每组元素个数)
-
变换(Transformation)——即分组对每个单元的数据进行操作(如元素标准化)
-
过滤(Filtration)——即按照某些规则筛选出一些组(如选出组内某一指标小于50的组)
7.举例:分组统计次数或者频数
①先排序,再分组,加上first()就是取最大值。
若B是种类,C是时间,就是先按种类分组,再按时间分组,取A最大的情况。
df1=df.sort_values('A', ascending=False).groupby(['B','C'], as_index=False).first()
②apply方法(groupby+apply这样的写法比之前写循环要快很多)
先分组再对A属性进行数量统计,加上head(1)取最大值
需要加上reset_index,时期扁平化,原来的index变成数据列,保留下来
df2=df.groupby('B')['A'].apply(lambda x: x.value_counts(normalize=True).head(1)).to_frame().reset_index()
举个例子:统计数学成绩前五名的学生
df = df['math'].groupby('class').apply(lambda x: x.sort_values(ascending = False)[:5])`
1. value_counts()方法
需要加上unstack()将其展开,否则是一个序列。
data.groupby('A')['B'].value_counts().unstack()
2.DataFrame.plot函数
画在一个子图里
pd.DateFrame.plot(kind = ‘scatter’)
ax=v1.plot.scatter(x='C',y='D',label='D',title=i,alpha=0.4,)
v1.plot.scatter(x='C',y='E',c='r',title=i,alpha=0.4,ax=ax,label='E')