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])

用法:

  1. 首先通过groupby得到DataFrameGroupBy对象, 比如data.groupby('race')
  2. 然后选择需要研究的列, 比如['age'], 这样我们就得到了一个SeriesGroupby, 它代表每一个组都有一个Series
  3. 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'))


posted @ 2020-07-15 09:46  林震宇  阅读(542)  评论(0编辑  收藏  举报