1 缺失值判断/填充/设置/删除:
(1)判断缺失值:
# 检查数据中是否含有任何缺失值:
df.isnull().values.any()
# 查看每列数据缺失值:
df.isnull().sum()
# 查看每列非缺失值数:
df.notnull().sum()
df.shape[0] - df.isnull().sum()
(2)缺失值填充:
# 用上下平均值填充:
df['xxx'] = df['xxx'].fillna(df['xxx'].interpolate())
# df (注意赋值,如果不赋值,原始序列未改变)
# 将缺失值全部替换为1.0:
df.fillna(value =1.0, inplace = True)
(3)更改缺失值:
# 将某列第10行到19行设置为缺失值:
df.loc[9:18,'xxx'] = np.nan
# 将第三行设置为缺失值:
df.loc[:2] = np.nan
(4)删除缺失值:
# 删除所有存在缺失值的行:
data.dropna(axis=0, how='any', inplace=True)
# 删除所有有缺失值的行
df.dropna() -- 默认axis=0
# 删除所有有缺失值的列
df.dropna(axis='columns')
df.dropna(axis=1)
# 删除所有值缺失的行
df.dropna(how='all')
# 删除至少有两个非缺失值的行
df.dropna(thresh=2)
# 指定判断缺失值的列范围
df.dropna(subset=['name', 'born'])
# 使删除和的结果生效
df.dropna(inplace=True)
#指定列的缺失值删除
df.toy.dropna()
2 数据去重:
# drop_duplicates()
df.drop_duplicates(['xxx'])
3 添加/删除数据:
(1)删除最后一行数据:
df.drop(index=[len(df)-1], inplace=True)
(2)添加一行数据:['Perl', 6.6]
# 方法一:字典
df2 = pd.DataFrame({
'grammer':['Perl'],
'popularity':[6.6]
})
df = df.append(df2,ignore_index=True)
df
# 方法二:loc
df.loc[len(df)] = ['Perl',6.6]
4 数据排序:
# 按照某一列值大小进行排序
df.sort_values(by=['popularity'], ascending=True) #注:ascending:True升序,False降序
5 数据类型转换:
(1)设置小数位数:
# 方法一:round()函数
df.round(3)
# 方法二:map + lambda
df['xxx'] = df['xxx'].map(lambda x : ('%.2f') % x)
# 方法三:map + lambda + format
df['xxx'] = df['xxx'].map(lambda x : format(x, '.2f'))
(2)设置百分数:
# 方法一:自定义函数+格式化处理
df['xxx'] = df['xxx'].map(lambda x : format(x, '.2%'))
# 方法二:style + 格式化处理
df.style.format({'xxx' : '{0:.2%}'.format})
(3)某列数据转换为浮点类型:
# 方法一:
df['xxx'].str.strip('$').astype('float') # 如果该列存美元符号
#方法二:
df['xxx'].apply(lambda x : float(x[1:])
(4)Series类型转list:
df['xxx'].tolist() #或者to_list()
(5)将时间戳类型数据转换为datetime类型:
# 将createTime(第一列)列时间转换为月-日:
for i in range(len(df)):
df.iloc[i,0] = df.iloc[i,0].to_pydatetime().strftime("%m-%d")
df.head()
# 注:采用Timestamp.to_pydatetime()函数将给定的时间戳转换为本地python datetime对象; strftime()
# 用来格式化datetime 对象;
# 参考资料:
# https://vimsky.com/examples/usage/python-pandas-timestamp-to_pydatetime.html
# https://blog.csdn.net/shomy_liu/article/details/44141483
(6)将字符串类型转换为datetime64:
# 方法一:
df['xxx'].astype('datetime64[ns]')
# 方法二:
df.Year = pd.to_datetime(df.Year,format='%Y')
6 数据拆分:
(1)某列按照'_'划分:
df['xxx'].str.split('_')
(2)strip() :删除开头和结尾的任何字符,默认空格
df['xxx'].strip('xxx')
7 将某列数据开根号:
# 方法一:apply() + np.sqrt()
df[['xxx']].apply(np.sqrt)
# 方法二:map + math.sqrt()
pd.DataFrame(df['xxx'].map(lambda x : math.sqrt(x)))
8 计算某列最大最小值之差(极差):
# 方法一:max(),min()
df['salary'].max() - df['salary'].min()
# 方法二:apply + lambda
df[['salary']].apply(lambda x : x.max() - x.min())
# 方法三:numpy.ptp()函数
np.ptp(df['salary'])
9 将某列数据(比如:薪资18k-23k)转换为最大值与最小值的平均值:
# apply + 自定义函数
def func(df):
min_max = df['salary'].split('-')
smin = int(min_max[0].strip('k'))
smax = int(min_max[1].strip('k'))
df['salary'] = int((smax + smin) / 2 * 1000)
return df
df = df.apply(func, axis=1)
df
10 新增一列根据某列数值大小划分为三个层次:Pandas.cut()
bins = [0, 5000, 20000, 50000]
group_names = ['低', '中', '高']
df['categories'] = pd.cut(df['salary'], bins, labels=group_names)
df
# 注:pandas.cut用来把一组数据分割成离散的区间
11 数据合并:concat,merge,append,join
(1)DataFrame.concat():
只是单纯的把两个表拼接在一起,参数axis是关键,它用于指定合并的轴是行还是列,axis默认是0。
# 将第一行与最后一行拼接:
pd.concat([df[:1], df[-2:-1]])
# 将两个dataframe按列合并:
pd.concat([df,df1], axis=1) # 按行合并,则axis=0
(2)merge():
针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。
# 按照单列合并数据:
pd.merge(df1, df2, on='key1')
# 按照多列合并数据:多列用列表
pd.merge(df1, df2, how='left', on=['key1', 'key2'])
#内外连接合并:
pd.merge(df1, df2, how='outer', on='subject_id') # inner内连接,outer外连接
(3)Series.append()/DataFrame.append():
纵向追加Series/DataFrame
# 将第8行数据添加至末尾:
df.append(df.iloc[7])
(4)DatadFrame.join:
主要用于索引上的合并,其参数的意义与merge方法中的参数意义基本一样。该方法最为简单,主要用于索引上的合并
12 数据透视表:Pandas.picot_table()
pivot_table(data, values=None, index=None, columns=None,aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
最重要的四个参数index、values、columns、aggfunc
相关资料:https://www.cnblogs.com/Yanjy-OnlyOne/p/11195621.html
# 以positionId为索引,生成两列(salary,score)的数据透视表:
df_picotTable = pd.pivot_table(df, values=['salary', 'score'], index='positionId')
13 分组抽样:Pandas.reshape()
# Year:按照每10年分组求和:
df.reshape('10AS').sum()
# day:找到每月最后一日
df.reshape('BM').mean()
14 日期索引最早与最晚日期相差多少天?
(df.index.max() - df.index.min()).days