当前位置: 代码迷 >> 综合 >> 五、数据处理
  详细解决方案

五、数据处理

热度:94   发布时间:2023-12-13 18:16:47.0

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 dfdf = 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

 

  相关解决方案