以前在学校里,跑深度学习实验,数据都是规则的、同质化数值型数据,很少字符型,只需熟练掌握 numpy 来处理数组、矩阵即可。
现在来工业级做推荐算法了,收集的数据大量都是字符型、异构的数据,因此需要 pandas 进行处理。乘着周末来好好梳理一下 pandas 的常见用法。
主要参考书籍:
- 《利用 Python 进行数据分析》pandas 之父
- 《Python 数据科学手册》
pandas 主要是用来处理表格型、异质型数据
import pandas as pd
from pandas import Series, DataFrame
- Series 是一种一维的数值型对象,包含一个值序列 (.values) 和一个索引 (.index),默认索引是从 0 到 N-1
obj = pd.Series([4, -2, 3, 4])
# 有两个属性,values, index
obj2 = pd.Series([4, -2, 3, 4], index=['d', 'b', 'c', 'a']
https://stackoverflow.com/questions/59991397/attributeerror-dataframe-object-has-no-attribute-ix
df.iloc[:, integer]
.ix is removed
By the way, df.loc[:,'col_header'] is for str or Boolean indexing (掩码,或者 index + columns)
drop_duplicates() 用法
# hot_user_set = set(all_data_expo_click.loc[all_data_expo_click['label'] == '1']['user_id'].drop_duplicates('user_id'))
hot_user_set = set(all_data_expo_click.loc[all_data_expo_click['label'] == '1']['user_id'].drop_duplicates('first'))
# 只取一列就变为了 Serie, 然而Series 没有列名
ValueError: keep must be either "first", "last" or False
# 使用 value_counts() 命令
df_train.porn.value_counts()
df_train[df_train['newsExposure30Days'] <= 1]['newsExposure30Days'].value_counts()
我一般先用 groupby 之后,然后 lang_type_df.count().sort_values()
pandas 的一个 bug:
train_infer_side_info = pd.concat([click_train_side_info, infer_side_info_dedup], axis=0).fillna("no value").astype(str)
# 假如 click_train_side_info 和 infer_side_infor_dudup 中列名一致,但是两者的列顺序是不一致的,这会导致 concat 后的表的列的顺序可能也无法保障。
在这时候,如果用 train_infer_side_info_array = np.array(train_infer_side_info) 那么对应到 array 里面的列的顺序可能是不一致的。
解决办法:
train_infer_side_info = train_infer_side_info[click_train_side_info.columns] # 保持原来的列顺序