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.遍历和求值

  1. 遍历

    for name,group in grouped_single:  
    	print(name)    
    	display(group.head())
    
  2. 组内求均值,最大值,最小值等等

df.groupby('A')['B'].mean()
  1. 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')