Python Pandas基本操作
Pandas
import pandas as pd
import numpy as np
导入数据
pd.read_csv(filename) # 从CSV文件导入数据
pd.read_table(filename) # 从限定分隔符的文本文件导入数据
pd.read_excel(filename) # 从Excel文件导入数据
pd.read_sql(query, connection_object) # 从SQL表/库导入数据
pd.read_json(json_string) # 从JSON格式的字符串导入数据
pd.read_html(url) # 解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard() # 从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict) # 从字典对象导入数据,Key是列名,Value是数据
导出数据
df.to_csv(filename) # 导出数据到CSV文件
df.to_excel(filename) # 导出数据到Excel文件
df.to_sql(table_name, connection_object) # 导出数据到SQL表
df.to_json(filename) # 以Json格式导出数据到文本文件
创建DataFrame
df=pd.DataFrame(['zerxxxo','one','twoxxx','three','xxxfour','fivxxxe'],columns=['SHORT_TITLE'])
df
数据查看
df.head(n) # 查看DataFrame对象的前n行
df.tail(n) # 查看DataFrame对象的最后n行
df.shape() # 查看行数和列数
df.info() # 查看索引、数据类型和内存信息
df.describe() # 查看数值型列的汇总统计
s.value_counts(dropna=False) # 查看Series对象的唯一值和计数
df.apply(pd.Series.value_counts) # 查看DataFrame对象中每一列的唯一值和计数
数据选取
# 按列选取,单列
df["colname"]
# 按列选取,多列
df["colname1","colname2"]
# 按索引选取,第一行
df.iloc[0]
# 按索引选取,第一行第一个元素
df.iloc[0,0]
# 类似ndarray选取,某些行的某些列
df.values[1:3,0:2]
# 选择col列的值大于0.5的行
df[df[col] > 0.5]
# 完全匹配strings1和colname1列中的字符串
df_lab.query('["strings1"] in colname1')
df_lab.query('["strings1"] not in colname1')
数据清理
# 重命名列
df.columns = ["a","b","c"]
# 选择性更改列名
df.rename(columns={'old_name': 'new_ name'})
# 更改索引列
df.set_index("column1")
# 批量重命名索引
df.rename(index=lambda x: x + 1)
# 返回空值的布尔数组
df.isnull()
# 返回非空值的布尔数组
df.notnull()
# 删除包含空值的行
df.dropna()
# 删除包含空值的列
df.dropna(axis=1)
# 删除包含小于n个非空值的列
df.dropna(axis=1, thresh=n)
# 用x填充空值
df.fillna(x)
数据合并
# 行合并
df1.append(df2)
# 列合并
pd.concat([df1,df2],axis = 1)
# 类似SQL形式的连接
df1.join(df2,on=colname1,how="inner")
数据统计
df.describe() # 查看数据值列的汇总统计
df.mean() # 返回所有列的均值
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值的个数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
模糊查询
以xxx开头
# 方法1:startswith函数
df[df.SHORT_TITLE.str.startswith('xxx')]
# 方法2:contains函数+正则表达式
df[df.SHORT_TITLE.str.contains('^xxx')]
# 方法3:query函数
df.query("SHORT_TITLE.str.startswith('xxx')",engine='python')
以xxx结尾
# 方法1:endswith函数
df[df.SHORT_TITLE.str.endswith('xxx')]
# 方法2:contains函数+正则表达式
df[df.SHORT_TITLE.str.contains('xxx$')]
# 方法3:query函数
df.query("SHORT_TITLE.str.endswith('xxx')",engine='python')
包含xxx
# 方法1:contains函数+正则表达式
df[df.SHORT_TITLE.str.contains('xxx')]
# 方法2:query函数
df.query("SHORT_TITLE.str.contains('xxx')",engine='python')
数据排序
df.sort_values(col1)
df.sort_values(col2,ascending=False)
df.sort_values(['col1','col2'],ascending=[True,False])
数据分组
# 不同种族人群的年龄均值, std, median, min, max
data.groupby('race')['age'].mean()
# 是否有精神异常迹象的分别有多少人
data.groupby('race')['signs_of_mental_illness'].value_counts()
data.groupby('race')['signs_of_mental_illness'].value_counts().unstack()
# 不同组内的年龄均值,中位数,方差 np.mean可以换成自定义函数
data.groupby('race')['age'].agg([np.mean, np.median, np.std])
用法:
- 首先通过
groupby
得到DataFrameGroupBy
对象, 比如data.groupby('race')
- 然后选择需要研究的列, 比如
['age']
, 这样我们就得到了一个SeriesGroupby
, 它代表每一个组都有一个Series
- 对
SeriesGroupby
进行操作, 比如.mean()
, 相当于对每个组的Series求均值
透视表
df.pivot_table()
DataFrame.apply()
遍历所有元素,对元素执行指定的function。
# 所有元素
df.apply(np.square)
# 指定列
df.apply(lambda x: np.square(x) if x.name=="colname1" else x)
# 指定行
df.apply(lambda x: np.square(x) if x.name=="aaa" else x ,axis=1)
日期相减
方法一
df["days"] = df["from_date"].apply(pd.to_datetime) - df["to_date"].apply(pd.to_datetime)
# 日期间隔已经计算出来,但后面带有一个单位 days,这是因为两个 datetime 类型相减,得到的数据类型是 timedelta64,如果只要数字,还需要使用 timedelta 的 days 属性转换一下。
df['elapsed'] = df["days"].apply(lambda x : x.days)
方法二
import pandas as pd
import datetime as dt
def get_interval_days(arrLike, start, end):
start_date = dt.datetime.strptime(arrLike[start], '%Y-%m-%d')
end_date = dt.datetime.strptime(arrLike[end], '%Y-%m-%d')
return (end_date - start_date).days
wbs = {
"wbs": ["job1", "job2", "job3", "job4"],
"date_from": ["2019-04-01", "2019-04-07", "2019-05-16","2019-05-20"],
"date_to": ["2019-05-01", "2019-05-17", "2019-05-31", "2019-06-11"]
}
df = pd.DataFrame(wbs)
df['elapsed'] = df.apply(
get_interval_days, axis=1, args=('date_from', 'date_to'))