zoukankan      html  css  js  c++  java
  • 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'))
    
    
    
  • 相关阅读:
    团队冲刺第五天
    每日学习
    团队冲刺第四天
    团队冲刺第三天
    每日学习
    2021.4.12
    2021.4.10
    2021.3.18
    2021.3.15
    2021.3.14
  • 原文地址:https://www.cnblogs.com/linzhenyu/p/13303835.html
Copyright © 2011-2022 走看看