Dataframe实用笔记


使用中持续更新…

1 Dataframe读取

读取多个文件,按行拼接成一个文件

# concat按行拼接,需确认各文件的每列内容能对应,需列名称完全相同,否则会单独生成列,未对应的自动填充NaN

# 读取源文件
# 假设文件1、2、3只有文件1含有[列名称]
# 如果各文件都含有列名称,则不需要设置header=None,不需要设置其他文件的列名称
df1 = pd.read_csv("./文件名1.csv", encoding='utf8')
df2 = pd.read_csv("./文件名2.csv", header=None, encoding='utf8')
df3 = pd.read_csv("./文件名3.csv", header=None, encoding='utf8')
# 补充文件的列名称,所有文件一定需要列名称,且同名
df2.columns = df1.columns
df3.columns = df1.columns
# concat按行拼接
data = pd.concat([df1, df2, df3], ignore_index=True, axis=0)

2 Dataframe单独创建

单独创建dataframe

# 用numpy创建一个6行*4列的dataframe
data = pd.DataFrame(np.arange(24).reshape(6,4),index=list("ABCDEF"),columns=list("WXYZ"))

3 Dataframe查找和定位

在一个Dataframe中根据需求查找/取值:

  • 某一列、连续的几列、间断的几列
  • 某一行、连续的几行、间断的几行
  • 某一个值、某几个值
  • 条件查找

方法:

  • 定位函数:loc和iloc
  • 列名称

3.1 loc

loc定位。

3.2 iloc

iloc取行

# 取单行
data= data.iloc[2]  # 取第2行(行数从0开始算)
# 取连续多行
data = data.iloc[3:6]  # 取第3、4、5行
# 取不连续的行
data = data.iloc[[0, 3, 5]]  # 取0、3、5行

iloc取列

# 取单列
data= data.iloc[:, 2]  # 取第2列(列数从0开始算)
# 取连续多列
data = data.iloc[:, 3:6]  # 取第3、4、5列
# 取不连续的列
data = data.iloc[:, [0, 3, 5]]  # 取0、3、5列

iloc取行+列(取特殊格点)

# 取单行+单列
data= data.iloc[2, 2]  # 取第2行、第2列(列数从0开始算)(即坐标(2,2)的值)
# 取连续多行+多列
data = data.iloc[2:5, 3:6]  # 取第2、3、4行,第3、4、5列
# 取不连续的行+不连续的列
data = data.iloc[[0,2], [0, 3, 5]]  # 取第0、2行,第0、3、5列
# 取连续的行+不连续的列
data = data.iloc[0:3, [0, 3, 5]]  # 取第0、1、2行,第0、3、5列

3.3 列名称直接取值

# 方式1
data[(data['列名称1'] > a) & (data['列名称2'] < b)]
# 方式2
data[(data.列名称1 > a) & (data.列名称2 < b)]

4 Dataframe 删除空值NaN

4.1 删除含空值的行

# 删除全部为空值的行
data = data.dropna(axis=0, how='all')
# 删除任意含空值的行
data = data.dropna(axis=0, how='any')

4.2 删除含空值的列

# 删除全部为空值的列
data = data.dropna(axis=1, how='all')
# 删除任意含空值的列
data = data.dropna(axis=1, how='any')

4.3 删除某一列中含有空值的行

# 删除某一列中含有空值的行
data = data.dropna(subset=['列名称'])

4.4 按行循环删除空值

假设原dataframe共7列,每一行随机位置固定含有2个NaN;现剔除所有的单个NaN后,全部向左对齐。

import pandas as pd

data = pd.read_csv("./文件名.csv", encoding='utf-8')
# 创建空的dataframe用于接收处理的单行Series
# 重置列名称,便于每一次循环后新添加的行能对齐
data_change = pd.DataFrame(columns=[0, 1, 2, 3, 4])
for i in range(len(data.index)):
    # 删除空值后重置Series索引,便于下一次添加能对齐
    data_change.loc[i] = data.loc[i].dropna().reset_index(drop=True)
    # 如果原dataframe行数过长,可以查看循环处理进度
    if i % 1000 == 0:
        print(i)
# 重新添加列名称
data_change.columns = ['col1', 'col2', 'col3', 'col4', 'col5']

5 Dataframe 填充空值NaN

5.1 空值填充0

# 空值全部填充0
data = data.fillna(0)

5.2 空值填充特定值

# 空值的特定填充
# 以字典的键-值对定向填充
data = data.fillna({'列名称1':特定值1, '列名称2':特定值2})

6 Dataframe 修改指定值

6.1 修改满足特定要求的值

# 列1小于a或列2大于b,且列3等于c时,列4满足前面条件时的值更改为d
data.loc[((data['列名称1'] < a) | (data['列名称2'] > b)) & (data['列名称3'] == c), '列名称4'] = d
data.loc[data[data['col']<0].index.tolist(),'col'] = 0

7 Dataframe 索引(行名称和列名称)

7.1 获取dataframe行/列名称列表

# 获取列名称并生成列表
data.columns.tolist()
# 或者
data.columns.values.tolist()

# 获取行名称并生成列表
data.index.tolist()
# 或者
data.index.values.tolist()

7.2 更改dataframe行/列名称

修改列名称

# 法一:直接修改,要求一次修改全部列名称
data.columns = ["新名称1", "新名称2",......, "新名称n"]
# 法二:指定修改部分列名称
data.rename(columns={'名1':'新名称1','名2':'新名称2'},inplace=True)

修改行索引

# 法一:直接修改,要求一次修改全部行名称
data.index = ["新行1", "新行2",......, "新行m"]
# 法二:指定修改部分行索引
data.rename(index={'行1':'新行1','行2':'新行2'},inplace=True)

修改行、列顺序

# 名称和data的值一起调整位置
# 出现新的行/列名称,data用NaN补齐
data.reindex(columns=["名称2", "名称1", "新名称3"])
data.reindex(index=["行2", "行1", "行3"])

8 Dataframe 其他函数

8.1 dataframe抽样

# 从data中随机抽取4行,random_state=1目的是保持抽样可重复,即下次抽样能抽到同样的结果
data.sample(n=4, random_state=1, axis=0)

# 完整sample函数
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
# n:抽取的行数,整数,如3;如果frac为空,n默认值为1;
# frac:抽取比例,小数,如0.6;抽样时n和frac二选一;
# replace:是否为有放回抽样,布尔型,默认False,True:有放回抽样,False:未放回抽样;
# weights:默认为等概率加权;
# random_state:随机种子,设置此值为任意实数,则每次随机的结果是一样的;
# axis:抽取数据的行还是列,axis=0的时是抽取行,axis=1时是抽取列

8.2 dataframe的行列转置

# 行列转置
data.T

8.3 dataframe的去重

# 行列转置
data.drop_duplicates()

8.4 dataframe的排序

# 根据行索引进行降序排序(排序时默认升序,降序设置ascending)
data.sort_index(ascending=False)

# 根据列索引进行排序
data.sort_index(axis=1)

# 根据值进行排序
data.sort_values(by='列名称')

# 根据多列的值进行排序
data.sort_values(by=['列名称1','列名称2'])

8.5 dataframe的统计全部元素个数

# 统计第1列
data.iloc[:, 1].value_counts()

data['列名称'].value_counts()

8.6 dataframe某列范围查询

# 筛选某一列包含列表中元素的df
df[df['列名称'].isin(list_name)]

8.7 numpy积分/曲线求面积

# 对曲线积分求面积
S = np.trapz(y, x)

8.8 dataframe一列滑移和差分

# 一列进行滑移或顺移
df.shift()
# 差分
df.diff()

9 Dataframe分组统计groupby.agg

# groupby分组,agg({'col1':'count','col2':'sum'})多功能统计
data111_h = data111.loc[data111['ash']>=40].groupby(['sby_ra_grp']).agg({'driver_id':'count','tsh_x':'sum','tsh_y':'sum'}).reset_index()

10 Dataframe透视表pivot_table

# pivot_table透视表,aggfunc={}统计计算
data10_sum = data10.pivot_table(index='wk',values=['tsh','driver_id'],aggfunc={'tsh':sum,'driver_id':np.size},fill_value=0).reset_index()
# aggfunc=['sum']统计
data31 = data30_dr.loc[data30_dr['type']!= 0].pivot_table(index='wk', values=['tsh','subsidy_b','dr_income','charge_time', 'charge_dis'], aggfunc=['sum'],fill_value=0).reset_index()

11 pyhive在线取dataframe

# 导入模块
import os 
import requests
import json
import numpy as np
import pandas as pd 
import datetime
from pyhive import hive
from datetime import datetime,timedelta
import datetime
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
from matplotlib import ticker

# 关闭科学输入法
pd.set_option('display.float_format',lambda x : '%.6f' % x)
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']

import numpy as np
from numpy import linalg as la
import pandas as pd
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib as mpl
import matplotlib.pyplot as plt
import time
from sklearn import preprocessing
import seaborn as sns
import os
import warnings


warnings.filterwarnings('ignore')
pd.set_option('max_column', 50)
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
# pd.set_option('max_rows', 200)

# 设置连接
conn = hive.connect(
        host=os.environ['PYHIVE_HOST'], 
        port=os.environ['PYHIVE_PORT'],
        username=os.environ['JUPYTER_HADOOP_USER'],
        password=os.environ['HADOOP_USER_PASSWORD'],
        auth='LDAP',
        configuration={'mapreduce.job.queuename': os.environ['JUPYTER_HADOOP_QUEUE'],
                       'hive.resultset.use.unique.column.names':'false'})
# sql
sql = '''
select * from table
'''
# 读取数据
df = pd.read_sql_query(sql,conn)
print(df)
# 存储和读取
df.to_csv('./y0_dr_inf_wk1_25.csv',index=0,encoding = 'utf-8-sig')
df0 = pd.read_csv('./y0_dr_inf_wk1_25.csv',encoding = 'utf-8-sig')
print(df0.info())
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值