数据框的创建
pandas.DataFrame(data=None, index=None, columns=None)
参数 |
说明 |
data |
数据, 用字典表示, 默认为空 |
index |
索引, 方便快速找到某个数据, 可以用列表/元祖表示, 默认为空 |
columns |
列, 可以用列表/元祖表示, 可以控制列的顺序, 更改列名, 默认为空 |
# 生成一个3行2列的数据框,列名分别为name, age; 索引分别为01,02,03
import pandas as pd
dataframe = pd.DataFrame(
data = {
'name': ['A', 'B', 'C'],
'age': [12, 13, 15],
'other': ['a', 'b', 'c']
},
index = ['01', '02', '03'],
columns = ['name', 'age']
)
In[4]: dataframe
Out[4]:
name age
01 A 12
02 B 13
03 C 15
数据框的访问
# 访问单列
In[5]: dataframe['name']
Out[5]:
01 A
02 B
03 C
Name: name, dtype: object
-------------------------------------------------------------------------------
# 访问多列
In[6]: dataframe[['name', 'age']]
Out[6]:
name age
01 A 12
02 B 13
03 C 15
--------------------------------------------------------------------------------
# 通过iloc访问单行多列
In[7]: dataframe.iloc[0, 0:2]
Out[7]:
name A
age 12
Name: 01, dtype: object
--------------------------------------------------------------------------------
# 通过loc访问多行单列
In[8]: ]dataframe.loc[['01', '02'], ['name']]
Out[8]:
name
01 A
02 B
---------------------------------------------------------------------------------
# 访问多行
In[9]: dataframe.iloc[0:3]
Out[9]:
name age
01 A 12
02 B 13
03 C 15
----------------------------------------------------------------------------------
PS: iloc访问于loc访问的区别在于是否通过索引名访问. iloc是通过索引访问的, 访问第一行就是iloc[0], 访问第二行就是iloc[1], 以此类推; loc是通过索引名访问的, 列如 loc['01'] loc['02']
数据框的修改
添加另一个数据框
In[10]: dataframe = dataframe.append(dataframe, ignore_index)
In[11]: dataframe
Out[11]:
name age
01 A 12
02 B 13
03 C 15
01 A 12
02 B 13
03 C 15
In[14]: dataframe = dataframe.append(dataframe, ignore_index=True)
In[15]: dataframe
Out[15]:
name age
0 A 12
1 B 13
2 C 15
3 A 12
4 B 13
5 C 15
6 A 12
7 B 13
8 C 15
9 A 12
10 B 13
11 C 15
数据的添加修改删除
# 列的添加
In[18]: dataframe['NUM'] = [1]*dataframe.shape[0]
In[19]: dataframe
Out[19]:
name age NUM
0 A 12 1
1 B 13 1
2 C 15 1
3 A 12 1
4 B 13 1
5 C 15 1
6 A 12 1
7 B 13 1
8 C 15 1
9 A 12 1
10 B 13 1
11 C 15 1
--------------------------------------------------------------------------
# 行的添加
In[20]: dataframe.loc['1234'] = ['30'] * dataframe.shape[1]
In[21]; dataframe
Out[21]:
name age NUM
0 A 12 1
1 B 13 1
2 C 15 1
3 A 12 1
4 B 13 1
5 C 15 1
6 A 12 1
7 B 13 1
8 C 15 1
9 A 12 1
10 B 13 1
11 C 15 1
1234 30 30 30
---------------------------------------------------------------------------
# 修改某一个单元格的值
In[22]: dataframe.at['1234', 'age'] = '2222'
In[23]: dataframe
Out[23]:
name age NUM
0 A 12 1
1 B 13 1
2 C 15 1
3 A 12 1
4 B 13 1
5 C 15 1
6 A 12 1
7 B 13 1
8 C 15 1
9 A 12 1
10 B 13 1
11 C 15 1
1234 30 2222 30
PS: 也可以用loc或者iloc
-----------------------------------------------------------------------------
# 列的删除
## 根据列名删除
dataframe = dataframe.drop('name', axis=1, inplace=False)
## 根据列索引删除列
dataframe = dataframe.drop(df.columns[[1, 2]], inplace=False, axis=1)
# 行的删除
dataframe = dataframe.drop(10, axis=0, inplace=False)
数据框的读取
读取excel
df = pd.read_excel(file_path, sheet_name=None, header=0, index_col=0, converters={'name': str}, na_values='')
读取csv
df pd.read_csv(file_path, engine='python', encoding='utf-8')
数据框的输出
输出excel
df.to_excel(file_path, index=False, header=True, sheet_name='table1')
输出csv
df.to_csv(file_path)
数据框的运算
df['name1'] = df['name'] + df['name']
df['name1'] = df['name'] - df['name']
df['name1'] = df['name'] * df['name']
df['name1'] = df['name'] / df['name']
数据框的排序
df = df.sort_values(by=['name', 'age'], ascending=[True, False], inplace=False)
参数 |
说明 |
by |
指定排序的那些列 |
ascending |
是否为升序, 默认是True升序, False是降序 |
inplace |
是否直接修改原数据, 默认是False不修改, 返回的是处理后的数据 |
数据框的重复处理
重复数据的查找
dup_df = df[df.duplicated(subset=['name'], keep='first')]
参数 |
说明 |
subset |
根据那些列判断重复, 默认所有的列 |
keep |
保留那个重复值, 默认是first(首个), last(最后), False都保留 |
PS: 单写df.duplicated()返回的是是一个序列数据类型是bool(布尔型),要想返回数据框,需写df[df.duplicated()]
重复数据的删除
df = df.drop_duplicates(subset, keep, inplace)
PS: 参数用法同上
数据框的空值处理
数据补齐
df = df.fillna(value)
PS: value 是填充的值
空值的删除
df = df.dropna(axis=0, how='any')
参数 |
说明 |
axis |
默认是0, 按行删除, 可以选1, 按列删除 |
how |
默认是any, 一个为空就删除, 可选all, 所有为空删除 |
空格数据处理
df['name'] = df['name'].str.strip()
数据框的数据转化
dtypes对应的数据
pandas数据类型 |
dtype |
pthon数据类型 |
说明 |
object |
O |
str |
字符型 |
int64 |
int64 |
int |
整数型 |
float64 |
float64 |
float |
浮点型 |
bool |
bool |
bool |
布尔型 |
datetime64 |
<M8[ns] |
datetime64[ns] |
日期时间类型 |
df.dtypes
# 查看数据框所有列的数据类型
数值转字符
df['name'] = df['name'].astype(str)
字符转数值
df['name'] = df['name'].astype(float)
字符转时间
df['time'] = pd.to_datetime(df['time'], format='%Y/%m/%d %H:%M:%S')
时间格式化
df['time'] = df['time'].dt.strftime('%Y-%m')
数据框的字段拆分
按照位置拆分
df['time'] = df['time'].slice(0, 3)
按照分隔符拆分
df['time'] = df['time'].str.split(pat=',', n=-1, expand=False)
参数 |
说明 |
pat |
分隔符, 默认是空格'' |
n |
分割为n+1列, -1代表返回所有列 |
expand |
是否展开为数据框, 默认是False, 一般设置为True |
时间属性的抽取
df.time_year = df.time.dt.year
df.time_month = df.time.dt.month
df.time_week = df.time.dt.weekday
df.time_day = df.time.dt.day
df.time_hour = df.time.dt.hour
df.time_minute = df.time.dt.minute
df.time_sec = df.time.dt.second
数据框的记录抽取
关键词抽取
fdf = df[df.name.str.contains(pat='str_key', na=False, case=True)]
空值抽取
fdf = df[df.time.isnull()]
数据范围抽取
fdf = df[df.age >= 20]
fdf = df[df.age.between(10, 20)]
时间范围抽取
dt1 = datetime(year=2021, month=1, day=1)
df2 = datetime(year=2021, month=2, day=2)
fdf = df[df.time >= dt1 & df.time <= dt2]
组合条件抽取
# 取反
fdf = df[~df.name.str.contains('str', na=False)]
# 与
fdf = df[(df.age > 20) & (df.age < 30) & df.name.str.contains('成', na='False')]
# 或
fdf = df[(df.age == 20) | (df.age == 23)]
数据框的数据合并
记录合并
fdf = pd.concat([df1, df2, df3])
字段匹配合并
fdf = pd.merge(df1, df2, on=[], how='inner')
参数 |
说明 |
df1 |
左边的数据框 |
df2 |
右边的数据框 |
on |
连接中使用的列名, left_on和right_on |
how |
连接的方法有 left, right, inner, outer |
数据框的数据分组
df = pd.DataFrame(np.random.uniform(1, 20, (4, 1))) # 随机产生一个4*1的数值在1到20之间的一个数据框
bins = [0, 5, 10, 20] # 设置数值范围
table = ['0-5', '5-10', '10-20'] # 设置显示标签
df['out'] = pd.cut(df[0], bins, labels=table, right=False) #right=True 区间为(],right=False区间为[)
print(df)
数据框的数据分析
- 对比分析
- 统计分析
数据框的数据图标
数据框的样式