Pandas 的DataFrame基本操作总结
最近在项目中使用到了Pandas的DataFrame,趁着新鲜劲儿,整理以下用到的知识,如果有不对的地方,请各位博主指正。
本博客从DataFrame创建以及对DataFrame的空,筛选列等操作做介绍。
1. 创建DataFrame
输入可以是np.array, list,也可以是excel,csv等。
df = pd.DataFrame([[1, "aa", 12, 67, "xian"],
[2, "bb", 13, 89, "shanghai"],
[3, "cc", 12, 56, "hangzhou"],
[4, "dd", 10, 90, "suzhou"]], columns=["id", "name", "credit", "score", "city"])
print(df.head())
输出
id name credit score city
0 1 aa 12 67 xian
1 2 bb 13 89 shanghai
2 3 cc 12 56 hangzhou
3 4 dd 10 90 suzhou
2. 基本操作
基本操作包含以下内容
- 对列的操作
- 对空的处理
- groupby
- 去重
- 统计不同的元素
- lambda 函数使用
- merge
- 保存
2.1 对列的操作
利用pandas读取csv文件
df = pd.read_csv("./xxxx.csv")
print("df columns: ", df.columns)
print('data size: ', df.shape)
print(df.head())
- 修改列名
df.columns = ['pclass', 'survived', 'name', 'sex', 'age', 'sibsp', 'parch', 'ticket',
'fare', 'cabin', 'embarked']
- 选择需要的列
df_name = df[['name', 'sex', 'age', 'sibsp']]
- 新增列
新增一列salary,并赋值为10000.
df["salary"] = 10000
2.2 对空值的处理
- 查看数据的空值缺失情况
df.isnull().sum()
输出
pclass 1
survived 1
name 1
sex 1
age 264
sibsp 1
parch 1
ticket 1
- 查看某一值的缺失比例
print('"age" 缺失的占比 %.2f%%' %((df['age'].isnull().sum()/df.shape[0])*100))
- 对空值的填充
- 这里采用均值填充,也可以采用最大值等其他方式填充。
data = df.copy()
data["age"].fillna(df["age"].median(skipna=True), inplace=True)
- 删除空值
data_na = df.copy()
print("data na shape: ", data_na.shape)
data_na = data_na.dropna()
print("data_na shape: ", data_na.shape)
data na shape: (1310, 12)
data_na shape: (270, 12)
2.3 分组
- groupby
- groupby返回的是DataFrame,index为groupby所选的列,可以与sum(), mean()等聚合函数一起使用。
data_gy = data.copy()
data_gy = data_gy[['pclass', 'survived', 'sex']].groupby(data_gy['age'])
print(data_gy.head())
(1)聚合运算
data_gy = data.copy()
data_gy = data_gy[['pclass', 'survived', 'sex']].groupby(data_gy['age']).mean()
print(data_gy.head())
(2)分组结果
data_gy = data.copy()
for name, group in data_gy[['sex', 'age']].groupby('age'):
print (group)
2.4 去重
去掉dataframe中的重复的行
data = df.copy()
data = data.drop_duplicates()
2.5 统计某一列的元素
方法1:
data = df.copy()
data["age"].fillna(df["age"].median(skipna=True), inplace=True)
age_list = list(set(data['age'].values.tolist()))
print("different age: ", age_list)
方法2:
age = data["age"].unique().tolist()
print("age set: ", age)
unique()是dataframe的内置函数,在数据量大的情况下,方法二比方法一的速度要快。
2.6 lambda 函数使用
lambda函数可以针对dataframe的列或者行自动遍历处理数据,比for循环快了很多。
- 新增列
df = pd.DataFrame([[1, "aa", "体育教学", 67, "xian", "体育新闻报道,刘翔姚明出席下午的活动"],
[2, "bb", "英语教学", 89, "shanghai","老板有着一口流利的英语"],
[3, "cc", "语文教学", 56, "hangzhou", "中国诗词大会上董卿随口说出很多诗句,还说出对诗的理解"],
[4, "dd", "数学", 90, "suzhou", "图像配准使用了微分几何的微分同胚"]],
columns=["id", "name", "class", "score", "city", "text"])
df["tag"] = df.apply(lambda x: "A" if x["score"] >= 89 else "B" if x["score"] >=60 and x["score"] < 89 else "C", axis=1)
输出
id name class score city text tag
0 1 aa 体育教学 67 xian 体育新闻报道,刘翔姚明出席下午的活动 B
1 2 bb 英语教学 89 shanghai 老板有着一口流利的英语 A
2 3 cc 语文教学 56 hangzhou 中国诗词大会上董卿随口说出很多诗句,还说出对诗的理解 C
3 4 dd 数学 90 suzhou 图像配准使用了微分几何的微分同胚 A
- lambda 可以写函数对元素进行操作处理
import jieba
def get_token(x):
token_list = [token for token in jieba.cut(x['text'])]
return token_list
df['token'] = df.apply(lambda x: get_token(x), axis=1)
输出
id name class score city text \
0 1 aa 体育教学 67 xian 体育新闻报道,刘翔姚明出席下午的活动
1 2 bb 英语教学 89 shanghai 老板有着一口流利的英语
2 3 cc 语文教学 56 hangzhou 中国诗词大会上董卿随口说出很多诗句,还说出对诗的理解
3 4 dd 数学 90 suzhou 图像配准使用了微分几何的微分同胚
token
0 [体育新闻, 报道, ,, 刘翔, 姚明, 出席, 下午, 的, 活动]
1 [老板, 有着, 一口, 流利, 的, 英语]
2 [中国, 诗词, 大会, 上, 董卿, 随口, 说出, 很多, 诗句, ,, 还, 说出, ...
3 [图像, 配准, 使用, 了, 微分, 几何, 的, 微分, 同, 胚]
2.7 merge
pandas的merge和sql中的join类似,分为left,right, inner, outer。其中on是选取哪一个列名进行关联,how是选择关联的方式。
df_name = pd.DataFrame([["aa", "体育"],
["bb", "英语"],
["cc", "语文"],
["dd", "数学"]], columns=["name", "func"])
df_new = pd.merge(df, df_name, on=["name"], how='inner')
2.8 保存
dataframe可以保存为csv,excel,也可以写入mysql数据库。
df.to_csv("文件名", index=False, header=True, encoding="utf-8)
df.to_excel("文件名", index=False, header=True, encoding="utf-8)
df.to_sql('数据库表名', database, index=False, if_exists='append')