本文将dataframe的应用分为以下几类:
1. 创建dataframe的方法
2. Dataframe读取文件的方法
3. 数据类型的转换
4. 增删改查 操作
5. 统计函数汇总
以下四种类型可以创建dataframe:
import pandas as pd
#excel
data = pd.read_excel("C://Desktop//工作簿1.xlsx",sheetname='sheet1',header=0,names=['第一列','第二列','第三列'])
#csv
data = pd.read_csv('C://Desktop//工作簿1.csv',sep=',',header=None,names=["第一列","第二列","第三列"],encoding='utf-8')
其中, read_excel的第一个位置的文件的路径
sheetname:指定读取excel中的哪一个工作表;
names:列名命名或重命名
header : 用作列名的行号,默认为header=0(表明第一行为列名);如果 header=None,则没有列名行。encoding :文件编码方式,编码为utf-8 ,以免打开有乱码
#txt
import pandas as pd
data = pd.read_table('C://Desktop//工作簿1.txt', sep = '\t', header = None, names = ['第一列','第二列','第三列'])
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://username:password@host:port/database')#类型+驱动+用户名+密码+服务器地址+端口+数据库名称
df=pd.read_sql_query('select * from 表名',con=engine) #查询语句+engine
import pandas as pd
# 创建一个DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c']
})
# 转换为字典,默认形式(列名作为键,数据作为值的列表)
dict_default = df.to_dict()
print(dict_default)
to_dict()
方法的orient
参数可以接受几个不同的值,用于控制字典的格式。
'list'
:每列的数据作为值的列表,忽略行索引。'series'
:每列的数据作为pandas.Series
对象,忽略行索引。'split'
:返回一个包含行索引和列名的字典。'records'
:返回一个字典列表,每个字典对应一行数据。'index'
:以行索引作为键,列名和数据作为值的嵌套字典。
#转换为字典,使用不同的orient参数的储存
dict_list = df.to_dict(orient='list')
dict_records = df.to_dict(orient='records')
dict_index = df.to_dict(orient='index')
print("字典形式 - 列表:", dict_list)
print("字典形式 - 记录:", dict_records)
print("字典形式 - 索引:", dict_index)
结果:
字典形式 - 列表: {'A': [1, 2, 3], 'B': ['a', 'b', 'c']}
字典形式 - 记录: [{'A': 1, 'B': 'a'}, {'A': 2, 'B': 'b'}, {'A': 3, 'B': 'c'}]
字典形式 - 索引: {0: {'A': 1, 'B': 'a'}, 1: {'A': 2, 'B': 'b'}, 2: {'A': 3, 'B': 'c'}}
import pandas as pd
# 创建一个DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c']
})
# 将DataFrame的列转换为列表
column_to_list = df['A'].tolist()
print(column_to_list)
其他特殊转换:
1. 将dataframe的特定某一行转列表:
rows_to_list= df.iloc[0].tolist() print(rows_to_list) #[1, 'a']
2. 将DataFrame的所有行转换为列表:
rows_to_list= [list(row) for index, row in df.iterrows()] print(rows_to_list) #[[1, 'a'], [2, 'b'], [3, 'c']]
3. 将DataFrame的整体数据转换为嵌套列表,即:每个内部列表代表一行数据
data_to_list = df.values.tolist() print(data_to_list) #[[1, 'a'], [2, 'b'], [3, 'c']]
import pandas as pd
# 创建一个DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c']
})
#将DataFrame的整体数据转换为元组的列表
data_to_tuples = tuple(df.to_numpy()) #需要先转成数组
print(data_to_tuples)
#((1, 'a'), (2, 'b'), (3, 'c'))
其他特殊转换:
# 将列转换为元组
columns_to_tuples = tuple(zip(df.to_numpy())) print(columns_to_tuples )
#将每一行转换为元组
rows_to_tuples = [row for index, row in df.iterrows()] print(rows_to_tuples )
# 将行和列都转换为元组
rows_columns_to_tuples = [(row.Index, tuple(row)) for index, row in df.iterrows()]
注意:当使用
to_json()
方法时,DataFrame
中的NaN
值将被转换为json中的null
值。如果你不希望这样,可以在转换之前对DataFrame
进行清洗或填充。
import pandas as pd
# 创建一个DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c']
})
# 将DataFrame转换为JSON字符串
json_str = df.to_json(orient='records')
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c']
})
#插入一列到最后
df['c']=[4,5,6] #df['列名']=value
print(df)
#插入到固定位置--第一个参数是位置(第一列)
df.insert(0,'AA', [1, 2, 3], allow_duplicates=False)#allow_duplicates=False不允许列名重复。
删除列
df.drop('C', axis=1, inplace=True) ## 删除列名C,axis=1表示操作的是列
删除行
df.drop(0, axis=0, inplace=True) #删除第1行,第一个位置是行数,axis=0是行,默认删除行
表头重命名:rename
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3],
'B': ['a', 'b', 'c']
})
df.rename(columns={'A':'新的名称A','B':'新的名称B'}, inplace = True)
print(df)
修改列名: 可以重新赋值给DataFrame
的columns
属性来修改列名。
df.columns = ['X', 'Y'] # 将列名A, B改为X, Y
修改数据: 可以直接通过索引或loc
来修改数据。
df.loc[0, 'A'] = 10# 修改第一行 、A列的值为10 (第一个位置是行数,第二个是列名)
df.at[0, 'B'] = 20 #或者用at去修改
print(df)
重置索引
df = df.reset_index(drop=True)
处理整个dataframe的前后字符串空格:
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
读取前5条
df.head()
查看某列的类型唯一项
df['列名'].unique()
查看数据集的信息
df.info()
描述统计
df.describe()
读取列名(表title)
df.columns
读取某一列
df['列名']
df = df[~df['update_time'].isin(['2022-02-30', '2022-02-29','2021-2-30', '2021-2-29'])]
#这里是将异常的日期去除
isin的方法也可以找到dataframe里不含某个list的一列,返回列的序号
df = pd.DataFrame({
'A': ['1', '2', '3'],
'B': ['a', 'b', 'c'],
'c': [4, 5, None]
})
lst=[4,5]
df[~df['c'].isin(lst)]
结果:
A B c
2 3 c NaN
```
1 处理order_date订单时间,将其规范化
df['order_date']=pd.to_datetime(df.order_date,format="%Y%m%d")
2 对月份数据进行计算
df['month']=df.order_dt.values.astype('datetime64[M]')
#df.order_date.values是将df.order_dt转换成数组的形式,然后使用astype函数将数组转化为datetime64格式,M的意思是以月份进行划分,方便后续的计算
3. 日期按照月份聚合
grouped_month=df.groupby('month') #给聚合的月份一个新的命名,放在最右边的列
或者
df= df.set_index('month')#会把日期放到最左边列
df.groupby('month').user_id.apply(lambda x:len(x.drop_duplicates()))