數(shù)據(jù)框的創(chuàng)建
pandas.DataFrame(data=None, index=None, columns=None)
參數(shù) |
說(shuō)明 |
data |
數(shù)據(jù), 用字典表示, 默認(rèn)為空 |
index |
索引, 方便快速找到某個(gè)數(shù)據(jù), 可以用列表/元祖表示, 默認(rèn)為空 |
columns |
列, 可以用列表/元祖表示, 可以控制列的順序, 更改列名, 默認(rèn)為空 |
# 生成一個(gè)3行2列的數(shù)據(jù)框,列名分別為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
數(shù)據(jù)框的訪問(wèn)
# 訪問(wèn)單列
In[5]: dataframe['name']
Out[5]:
01 A
02 B
03 C
Name: name, dtype: object
-------------------------------------------------------------------------------
# 訪問(wèn)多列
In[6]: dataframe[['name', 'age']]
Out[6]:
name age
01 A 12
02 B 13
03 C 15
--------------------------------------------------------------------------------
# 通過(guò)iloc訪問(wèn)單行多列
In[7]: dataframe.iloc[0, 0:2]
Out[7]:
name A
age 12
Name: 01, dtype: object
--------------------------------------------------------------------------------
# 通過(guò)loc訪問(wèn)多行單列
In[8]: ]dataframe.loc[['01', '02'], ['name']]
Out[8]:
name
01 A
02 B
---------------------------------------------------------------------------------
# 訪問(wèn)多行
In[9]: dataframe.iloc[0:3]
Out[9]:
name age
01 A 12
02 B 13
03 C 15
----------------------------------------------------------------------------------
PS: iloc訪問(wèn)于loc訪問(wèn)的區(qū)別在于是否通過(guò)索引名訪問(wèn). iloc是通過(guò)索引訪問(wèn)的, 訪問(wèn)第一行就是iloc[0], 訪問(wèn)第二行就是iloc[1], 以此類推; loc是通過(guò)索引名訪問(wèn)的, 列如 loc['01'] loc['02']
數(shù)據(jù)框的修改
添加另一個(gè)數(shù)據(jù)框
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
數(shù)據(jù)的添加修改刪除
# 列的添加
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
---------------------------------------------------------------------------
# 修改某一個(gè)單元格的值
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
-----------------------------------------------------------------------------
# 列的刪除
## 根據(jù)列名刪除
dataframe = dataframe.drop('name', axis=1, inplace=False)
## 根據(jù)列索引刪除列
dataframe = dataframe.drop(df.columns[[1, 2]], inplace=False, axis=1)
# 行的刪除
dataframe = dataframe.drop(10, axis=0, inplace=False)
數(shù)據(jù)框的讀取
讀取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')
數(shù)據(jù)框的輸出
輸出excel
df.to_excel(file_path, index=False, header=True, sheet_name='table1')
輸出csv
df.to_csv(file_path)
數(shù)據(jù)框的運(yùn)算
df['name1'] = df['name'] + df['name']
df['name1'] = df['name'] - df['name']
df['name1'] = df['name'] * df['name']
df['name1'] = df['name'] / df['name']
數(shù)據(jù)框的排序
df = df.sort_values(by=['name', 'age'], ascending=[True, False], inplace=False)
參數(shù) |
說(shuō)明 |
by |
指定排序的那些列 |
ascending |
是否為升序, 默認(rèn)是True升序, False是降序 |
inplace |
是否直接修改原數(shù)據(jù), 默認(rèn)是False不修改, 返回的是處理后的數(shù)據(jù) |
數(shù)據(jù)框的重復(fù)處理
重復(fù)數(shù)據(jù)的查找
dup_df = df[df.duplicated(subset=['name'], keep='first')]
參數(shù) |
說(shuō)明 |
subset |
根據(jù)那些列判斷重復(fù), 默認(rèn)所有的列 |
keep |
保留那個(gè)重復(fù)值, 默認(rèn)是first(首個(gè)), last(最后), False都保留 |
PS: 單寫(xiě)df.duplicated()返回的是是一個(gè)序列數(shù)據(jù)類型是bool(布爾型),要想返回?cái)?shù)據(jù)框,需寫(xiě)df[df.duplicated()]
重復(fù)數(shù)據(jù)的刪除
df = df.drop_duplicates(subset, keep, inplace)
PS: 參數(shù)用法同上
數(shù)據(jù)框的空值處理
數(shù)據(jù)補(bǔ)齊
df = df.fillna(value)
PS: value 是填充的值
空值的刪除
df = df.dropna(axis=0, how='any')
參數(shù) |
說(shuō)明 |
axis |
默認(rèn)是0, 按行刪除, 可以選1, 按列刪除 |
how |
默認(rèn)是any, 一個(gè)為空就刪除, 可選all, 所有為空刪除 |
空格數(shù)據(jù)處理
df['name'] = df['name'].str.strip()
數(shù)據(jù)框的數(shù)據(jù)轉(zhuǎn)化
dtypes對(duì)應(yīng)的數(shù)據(jù)
pandas數(shù)據(jù)類型 |
dtype |
pthon數(shù)據(jù)類型 |
說(shuō)明 |
object |
O |
str |
字符型 |
int64 |
int64 |
int |
整數(shù)型 |
float64 |
float64 |
float |
浮點(diǎn)型 |
bool |
bool |
bool |
布爾型 |
datetime64 |
<M8[ns] |
datetime64[ns] |
日期時(shí)間類型 |
df.dtypes
# 查看數(shù)據(jù)框所有列的數(shù)據(jù)類型
數(shù)值轉(zhuǎn)字符
df['name'] = df['name'].astype(str)
字符轉(zhuǎn)數(shù)值
df['name'] = df['name'].astype(float)
字符轉(zhuǎn)時(shí)間
df['time'] = pd.to_datetime(df['time'], format='%Y/%m/%d %H:%M:%S')
時(shí)間格式化
df['time'] = df['time'].dt.strftime('%Y-%m')
數(shù)據(jù)框的字段拆分
按照位置拆分
df['time'] = df['time'].slice(0, 3)
按照分隔符拆分
df['time'] = df['time'].str.split(pat=',', n=-1, expand=False)
參數(shù) |
說(shuō)明 |
pat |
分隔符, 默認(rèn)是空格'' |
n |
分割為n+1列, -1代表返回所有列 |
expand |
是否展開(kāi)為數(shù)據(jù)框, 默認(rèn)是False, 一般設(shè)置為True |
時(shí)間屬性的抽取
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
數(shù)據(jù)框的記錄抽取
關(guān)鍵詞抽取
fdf = df[df.name.str.contains(pat='str_key', na=False, case=True)]
空值抽取
fdf = df[df.time.isnull()]
數(shù)據(jù)范圍抽取
fdf = df[df.age >= 20]
fdf = df[df.age.between(10, 20)]
時(shí)間范圍抽取
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)]
數(shù)據(jù)框的數(shù)據(jù)合并
記錄合并
fdf = pd.concat([df1, df2, df3])
字段匹配合并
fdf = pd.merge(df1, df2, on=[], how='inner')
參數(shù) |
說(shuō)明 |
df1 |
左邊的數(shù)據(jù)框 |
df2 |
右邊的數(shù)據(jù)框 |
on |
連接中使用的列名, left_on和right_on |
how |
連接的方法有 left, right, inner, outer |
數(shù)據(jù)框的數(shù)據(jù)分組
df = pd.DataFrame(np.random.uniform(1, 20, (4, 1))) # 隨機(jī)產(chǎn)生一個(gè)4*1的數(shù)值在1到20之間的一個(gè)數(shù)據(jù)框
bins = [0, 5, 10, 20] # 設(shè)置數(shù)值范圍
table = ['0-5', '5-10', '10-20'] # 設(shè)置顯示標(biāo)簽
df['out'] = pd.cut(df[0], bins, labels=table, right=False) #right=True 區(qū)間為(],right=False區(qū)間為[)
print(df)
數(shù)據(jù)框的數(shù)據(jù)分析
- 對(duì)比分析
- 統(tǒng)計(jì)分析
數(shù)據(jù)框的數(shù)據(jù)圖標(biāo)
數(shù)據(jù)框的樣式