利用python 進行數據清洗


import pandas as pd
data.to_csv("路徑",encoding=utf-8) 保存文件
data.head() 查看前幾行
data.tail() 查看后幾行
data.shape  幾行幾列
data.index  查看索引
data.columns 查看標題
data.values  查看值
data.info    查看整體結構
data.describe() 對數值型數據進行描述統計
data.value_counts()對值計數
data.sort_index(axis=1/0)  對索引進行排序 參數ascending=False 降序排序
data.sort_calues(by="columens") 按照某一行的值進行排序 inplace=True 修改原始數據
選取數據
data.columns
data["cloumns"]
data.loc[] 顯示索引
data.iloc[] 隱示索引

set_option () 函數解決顯示不全的問題

# 顯示所有列
pd.set_option('display.max_columns', None)
pd.set_option('display.max_columns', 5)  #最多顯示五列
 # 顯示所有行
pd.set_option('display.max_rows', None)
#顯示df的所有列
pd.set_option('display.max_columns', len(df.columns))

 

# 映射函數 data.apply()

#data.apply(abs) 將abs作用於data的每一個數據
data=pd.Series([1,-2,3,-3],index=["a","b","c","d"])
data.apply(abs)
Out[6]:
a    1
b    2
c    3
d    3
dtype: int64
In [ ]:
data.iloc[[0,2],data.columns.get_loc("one")] 混合索引 0-2 行 one列
data.iloc[[0,2],data.columns.get_indexer(["one","tow"])] 同時得到2列
  布爾型索引
In [ ]:
布兒型索引
| 代表 or & 代表 and -代表not
data[(df.one>0)&(df.two>0)]
data[(df.one>0)|(df.two>0)]
data[(df.one>0)-(df.two>0)]
用與篩選需要的子集
In [9]:
import numpy as np
ser=pd.Series(np.arange(5),index=np.arange(5)[::-1],dtype="int32")
ser
Out[9]:
4    0
3    1
2    2
1    3
0    4
dtype: int32
In [10]:
ser.isin([2,3,4])#查看是否存在 2,3,4
Out[10]:
4    False
3    False
2     True
1     True
0     True
dtype: bool
 

sample(),方法隨機抽樣

In [11]:
###隨機抽樣
sample()方法從Series或者DataFriame中隨機選擇行或列
ser.sample()
參數 n
=None, #抽取多少個 frac=None, #抽取多少比列 replace=False, #是否為有放回抽樣 weights=None, #設定每一行的權重 random_state=None, #是否需要重現隨機的結果,設置隨機數種子 axis=None # 設定是對行采樣還是對列采樣
In [12]:
ser=pd.Series([1,2,3,4,5])
ser
Out[12]:
0    1
1    2
2    3
3    4
4    5
dtype: int64
In [13]:
ser.sample()#默認抽取一個
Out[13]:
0    1
dtype: int64
In [14]:
ser.sample(4)#默認抽取4個
Out[14]:
0    1
2    3
4    5
3    4
dtype: int64
In [15]:
ser.sample(frac=0.8)#抽取80%
Out[15]:
3    4
1    2
0    1
2    3
dtype: int64
In [16]:
#不加參數默認進行不放回抽樣,使用replace 替換抽樣方式
ser.sample(n=5,replace=False)# 不放回
Out[16]:
3    4
0    1
2    3
1    2
4    5
dtype: int64
In [17]:
ser.sample(n=5,replace=True)#有放回
Out[17]:
0    1
4    5
3    4
3    4
2    3
dtype: int64
In [24]:
ser_weight=[0.1,0.2,0.2,0.3,0.4]
ser.sample(n=4,weights=ser_weight )   
#總體權重和為1 如果輸入的值不為一,會從新歸一化
Out[24]:
3    4
4    5
0    1
2    3
dtype: int64
In [25]:
#在采樣中,會用DataFrame的某一列作為權重
df=pd.DataFrame({"first":[4,5,6,7],"weight_column":[0.3,0.4,0.2,0.1]})
df
Out[25]:
  first weight_column
0 4 0.3
1 5 0.4
2 6 0.2
3 7 0.1
In [27]:
 
df.sample(n=2,weights="weight_column")
 
Out[27]:
  first weight_column
2 6 0.2
1 5 0.4
In [29]:
 df.sample(n=2,axis=1)
 
Out[29]:
  weight_column first
0 0.3 4
1 0.4 5
2 0.2 6
3 0.1 7
In [32]:
df.sample(n=2,random_state=2)
 
Out[32]:
  first weight_column
2 6 0.2
3 7 0.1
In [33]:
 
?df.sample
 

數據合並

In [39]:
df1=pd.DataFrame({"A":["A0","A1","A2","A3"],"B":["B0","B1","B2","B3"],
"C":["C0","C1","C2","C3"],
"D":["D0","D1","D2","D3"]},index=[0,1,2,3])
df2=pd.DataFrame({"A":["A0","A1","A2","A3"],"B":["B0","B1","B2","B3"],
"C":["C0","C1","C2","C3"],
"D":["D0","D1","D2","D3"]},index=[4,5,6,7])
df3=pd.DataFrame({"A":["A0","A1","A2","A3"],"B":["B0","B1","B2","B3"],
"C":["C0","C1","C2","C3"],
"D":["D0","D1","D2","D3"]},index=[8,9,10,11])

In [41]:

print(df1);print(df2);print(df3)
    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
    A   B   C   D
4  A0  B0  C0  D0
5  A1  B1  C1  D1
6  A2  B2  C2  D2
7  A3  B3  C3  D3
     A   B   C   D
8   A0  B0  C0  D0
9   A1  B1  C1  D1
10  A2  B2  C2  D2
11  A3  B3  C3  D3
 

用pd。concat()合並數據

In [ ]:
###用pd.concat()合並對象
參數
pd.concat()
objs,  數據集
axis=0,  軸線 默認0
join='outer',  連接方式 inner outer
join_axes=None, 用指定的軸進行合並
ignore_index=False,都合並沒有就不合並 /True 根據列字段對齊合並,生成新的索引
keys=None, 指定不同數據源
levels=None, 
names=None, 
verify_integrity=False, 
copy=True)
In [43]:
pd.concat([df1,df2,df3])#列合並
Out[43]:
  A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A0 B0 C0 D0
5 A1 B1 C1 D1
6 A2 B2 C2 D2
7 A3 B3 C3 D3
8 A0 B0 C0 D0
9 A1 B1 C1 D1
10 A2 B2 C2 D2
11 A3 B3 C3 D3
In [45]:
 
df4=pd.DataFrame({"B":["B0","B1","B2","B3"],
"C":["C0","C1","C2","C3"],
"E":["E0","E1","E4","E5"]},index=[0,1,4,5])
df4
Out[45]:
  B C E
0 B0 C0 E0
1 B1 C1 E1
4 B2 C2 E4
5 B3 C3 E5
In [46]:
pd.concat([df1,df4],axis=1)#橫向合並
 
Out[46]:
  A B C D B C E
0 A0 B0 C0 D0 B0 C0 E0
1 A1 B1 C1 D1 B1 C1 E1
2 A2 B2 C2 D2 NaN NaN NaN
3 A3 B3 C3 D3 NaN NaN NaN
4 NaN NaN NaN NaN B2 C2 E4
5 NaN NaN NaN NaN B3 C3 E5
In [47]:
pd.concat([df1,df4],axis=1,join="inner")#取交集
Out[47]:
  A B C D B C E
0 A0 B0 C0 D0 B0 C0 E0
1 A1 B1 C1 D1 B1 C1 E1
In [49]:
pd.concat([df1,df4],axis=1,join_axes=[df1.index])#指定合並的軸
Out[49]:
  A B C D B C E
0 A0 B0 C0 D0 B0 C0 E0
1 A1 B1 C1 D1 B1 C1 E1
2 A2 B2 C2 D2 NaN NaN NaN
3 A3 B3 C3 D3 NaN NaN NaN
In [52]:
 pd.concat([df1,df4],ignore_index=False)
Out[52]:
  A B C D E
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
0 NaN B0 C0 NaN E0
1 NaN B1 C1 NaN E1
4 NaN B2 C2 NaN E4
5 NaN B3 C3 NaN E5
In [53]:
 pd.concat([df1,df4],ignore_index=True)#生成新的index

Out[53]:

  A B C D E
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
4 NaN B0 C0 NaN E0
5 NaN B1 C1 NaN E1
6 NaN B2 C2 NaN E4
7 NaN B3 C3 NaN E5
In [54]:
ser=pd.Series(["s0","s1","s2","s3"],name="s")
ser
Out[54]:
0    s0
1    s1
2    s2
3    s3
Name: s, dtype: object
In [56]:
pd.concat([df1,ser],axis=1)#合並之后Series的名稱自動成為列名稱,不指定name自動生成
Out[56]:
  A B C D s
0 A0 B0 C0 D0 s0
1 A1 B1 C1 D1 s1
2 A2 B2 C2 D2 s2
3 A3 B3 C3 D3 s3
In [61]:
pd.concat([df1,df2,df3],keys=["one","two","three"])#區分不同的數據來源
Out[61]:
    A B C D
one 0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
two 4 A0 B0 C0 D0
5 A1 B1 C1 D1
6 A2 B2 C2 D2
7 A3 B3 C3 D3
three 8 A0 B0 C0 D0
9 A1 B1 C1 D1
10 A2 B2 C2 D2
11 A3 B3 C3 D3
In [60]:
data=pd.concat([df1,df2,df3])
dic={"one":df1,"two":df2,"three":df3}
pd.concat(dic) #也可以區分不同的數據集
 
Out[60]:
    A B C D
one 0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
three 8 A0 B0 C0 D0
9 A1 B1 C1 D1
10 A2 B2 C2 D2
11 A3 B3 C3 D3
two 4 A0 B0 C0 D0
5 A1 B1 C1 D1
6 A2 B2 C2 D2
7 A3 B3 C3 D3
 

用append 實現合並

In [ ]:
df.append()
 [63]:
df1.append(df4)
Out[63]:
  A B C D E
0 A0 B0 C0 D0 NaN
1 A1 B1 C1 D1 NaN
2 A2 B2 C2 D2 NaN
3 A3 B3 C3 D3 NaN
0 NaN B0 C0 NaN E0
1 NaN B1 C1 NaN E1
4 NaN B2 C2 NaN E4
5 NaN B3 C3 NaN E5
In [64]:
 
df1.append([df2,df3])
Out[64]:
  A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 A0 B0 C0 D0
5 A1 B1 C1 D1
6 A2 B2 C2 D2
7 A3 B3 C3 D3
8 A0 B0 C0 D0
9 A1 B1 C1 D1
10 A2 B2 C2 D2
11 A3 B3 C3 D3
 

#用append方法添加新行

In [65]:
ser3=pd.Series(["q1","q2","q3","q4"],index=["A","B","C","D"])
ser3
Out[65]:
A    q1
B    q2
C    q3
D    q4
dtype: object
In [67]:
df1.append(ser3,ignore_index=True)
Out[67]:
  A B C D
0 A0 B0 C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
4 q1 q2 q3 q4
 

pandas 數據清洗案列

In [71]:
import pandas as pd
1.數據的讀取
In [84]:
df=pd.read_csv("taobao.csv",encoding="gbk")
df.head()
Out[84]:
  寶貝 價格 成交量 位置 品牌
0 母親節衣服夏季中年女裝連衣裙中長款裙子中老年媽媽裝夏裝40歲50 148.0 9276 浙江 嘉興 淺戀
1 中年女夏裝40-50歲中老年女裝媽媽裝雪紡連衣裙短袖中長款裙子 129.0 3593 浙江 杭州 緣福
2 母親節衣服夏季中年女裝夏裝短袖40-50歲媽媽裝中老年女裝連衣裙 59.0 18569 江蘇 蘇州 洛妃
3 中老年女裝夏裝連衣裙中年雪紡上衣媽媽裝中長款40-50歲大碼裙子 38.8 10296 上海 NaN
4 媽媽夏裝套裝40歲中老年女裝春裝中年連衣裙兩件套母親節衣服夏季 128.0 13313 江蘇 蘇州 孔雀
In [86]:
df.tail(10)
Out[86]:
  寶貝 價格 成交量 位置 品牌
421 中年女夏裝2017新款40-50歲媽媽裝夏天短袖中長款雪紡連衣裙寬松 89.0 439 浙江 嘉興 佳人
422 母親節中年媽媽夏裝連衣裙大碼中老年春夏季上衣服女雪紡裙40歲50 138.0 118 湖北 武漢 戀慈
423 母親節衣服中年媽媽雪紡連衣裙中老年大碼女裝夏天中長款裙子40歲 36.0 817 江蘇 蘇州 NaN
424 春裝結婚宴婚慶媽媽裝蕾絲連衣裙夏季大碼女裝宴會喜慶婆婆婚禮服 218.0 525 廣東 東莞 蘭香
425 中年假兩件套夏季媽媽裝女裝印花夏天雪紡連衣裙短袖30-40-50歲 129.0 96 北京 other/其他
426 中老年女裝夏裝連衣裙中長款打底衫女40-50歲中年媽媽裝短袖裙子 39.9 535 江蘇 蘇州 NaN
427 天天特價中老年春夏新款真絲大碼短袖中長款連衣裙修身百褶裙女裝 89.0 1416 廣東 廣州 NaN
428 2017夏季新款優雅印花真絲連衣裙中長款短袖桑蠶絲寬松大碼中老年 349.0 284 浙江 杭州 YL-TianRui/睿
429 2017春裝媽媽裝新款中老年女裝蕾絲連衣裙中長款裙子母親節衣服夏 78.0 313 江蘇 蘇州
430 中老年女裝蕾絲夏裝媽媽裝連衣裙上衣中年女大碼寬松刺綉短袖T恤 48.0 688 江蘇 蘇州 other/其他
 

2.快速探索

In [87]:
df.info()
Out[88]:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 431 entries, 0 to 430
Data columns (total 5 columns):
寶貝     431 non-null object
價格     431 non-null float64
成交量    431 non-null int64
位置     431 non-null object
品牌     349 non-null object
dtypes: float64(1), int64(1), object(3)
memory usage: 16.9+ KB
In [88]:
#查看描述統計信息
df.describe()

 

Out[88]:
  價格 成交量
count 431.000000 431.000000
mean 133.149977 1545.044084
std 85.433711 1901.357985
min 14.900000 80.000000
25% 89.000000 438.000000
50% 128.000000 919.000000
75% 158.000000 1894.500000
max 866.000000 18569.000000
 

3.數據的選擇

In [90]:
#行的選擇
df[0:5]
df.iloc[0:5]
Out[90]:
  寶貝 價格 成交量 位置 品牌
0 母親節衣服夏季中年女裝連衣裙中長款裙子中老年媽媽裝夏裝40歲50 148.0 9276 浙江 嘉興
1 中年女夏裝40-50歲中老年女裝媽媽裝雪紡連衣裙短袖中長款裙子 129.0 3593 浙江 杭州 緣福
2 母親節衣服夏季中年女裝夏裝短袖40-50歲媽媽裝中老年女裝連衣裙 59.0 18569 江蘇 蘇州 pllo洛妃
3 中老年女裝夏裝連衣裙中年雪紡上衣媽媽裝中長款40-50歲大碼裙子 38.8 10296 上海 NaN
4 媽媽夏裝套裝40歲中老年女裝春裝中年連衣裙兩件套母親節衣服夏季 128.0 13313 江蘇 蘇州 孔雀
In [91]:
#列的選擇
cols=df[["寶貝","價格"]]
type(cols)
cols.head()
cols=df[["寶貝","價格"]].head()#數據太多讀取太慢,可選擇只查看多少行
cols
Out[91]:
  寶貝 價格
0 母親節衣服夏季中年女裝連衣裙中長款裙子中老年媽媽裝夏裝40歲50 148.0
1 中年女夏裝40-50歲中老年女裝媽媽裝雪紡連衣裙短袖中長款裙子 129.0
2 母親節衣服夏季中年女裝夏裝短袖40-50歲媽媽裝中老年女裝連衣裙 59.0
3 中老年女裝夏裝連衣裙中年雪紡上衣媽媽裝中長款40-50歲大碼裙子 38.8
4 媽媽夏裝套裝40歲中老年女裝春裝中年連衣裙兩件套母親節衣服夏季 128.0
In [95]:
#區域的選擇
df.loc[0:3,["寶貝","價格"]]
df.loc[df.index[0:3],["寶貝","價格"]]
Out[95]:
  寶貝 價格
0 母親節衣服夏季中年女裝連衣裙中長款裙子中老年媽媽裝夏裝40歲50 148.0
1 中年女夏裝40-50歲中老年女裝媽媽裝雪紡連衣裙短袖中長款裙子 129.0
2 母親節衣服夏季中年女裝夏裝短袖40-50歲媽媽裝中老年女裝連衣裙 59.0
 

4.數據的整理

In [96]:
df["銷售額"]=df["價格"]*df["成交量"]
df.head()
Out[96]:
  寶貝 價格 成交量 位置 品牌 銷售額
0 母親節衣服夏季中年女裝連衣裙中長款裙子中老年媽媽裝夏裝40歲50 148.0 9276 浙江 嘉興 1372848.0
1 中年女夏裝40-50歲中老年女裝媽媽裝雪紡連衣裙短袖中長款裙子 129.0 3593 浙江 杭州 緣福 463497.0
2 母親節衣服夏季中年女裝夏裝短袖40-50歲媽媽裝中老年女裝連衣裙 59.0 18569 江蘇 蘇州 pllofee/洛妃 1095571.0
3 中老年女裝夏裝連衣裙中年雪紡上衣媽媽裝中長款40-50歲大碼裙子 38.8 10296 上海 NaN 399484.8
4 媽媽夏裝套裝40歲中老年女裝春裝中年連衣裙兩件套母親節衣服夏季 128.0 13313 江蘇 蘇州 孔雀 1704064.0
In [102]:
#過濾掉價格>=100,成交量<8000的商品信息
df[(df["價格"]<100)&(df["成交量"]>=8000)]
Out[102]:
  寶貝 價格 成交量 位置 品牌 銷售額
2 母親節衣服夏季中年女裝夏裝短袖40-50歲媽媽裝中老年女裝連衣裙 59.0 18569 江蘇 蘇州 pllofe洛妃 1095571.0
3 中老年女裝夏裝連衣裙中年雪紡上衣媽媽裝中長款40-50歲大碼裙子 38.8 10296 上海 NaN 399484.8
5 新款媽媽裝連衣裙中長款短袖夏裝中年婦女40-50大碼氣質打底裙子 37.8 8844 北京 瑪依 334303.2
7 媽媽夏裝套裝女40-50歲上衣2017新款時尚兩件套中老年春裝連衣裙 98.0 8494 浙江 嘉興 錦蒂 832412.0
In [105]:
#將位置設置為索引
#df.index=df["位置"]
df1=df.set_index("位置")
df1.head()
Out[105]:
  寶貝 價格 成交量 品牌 銷售額
位置          
浙江 嘉興 母親節衣服夏季中年女裝連衣裙中長款裙子中老年媽媽裝夏裝40歲50 148.0 9276 1372848.0
浙江 杭州 中年女夏裝40-50歲中老年女裝媽媽裝雪紡連衣裙短袖中長款裙子 129.0 3593 緣福 463497.0
江蘇 蘇州 母親節衣服夏季中年女裝夏裝短袖40-50歲媽媽裝中老年女裝連衣裙 59.0 18569 p洛妃 1095571.0
上海 中老年女裝夏裝連衣裙中年雪紡上衣媽媽裝中長款40-50歲大碼裙子 38.8 10296 NaN 399484.8
江蘇 蘇州 媽媽夏裝套裝40歲中老年女裝春裝中年連衣裙兩件套母親節衣服夏季 128.0 13313 孔雀 1704064.0
In [106]:
#排序
df2=df1.sort_index()
df2.head()
Out[106]:
  寶貝 價格 成交量 品牌 銷售額
位置          
上海 樂卡索媽媽裝春裝中袖中年女裝大花純色打底中老年夏季大碼連衣裙 179.0 866 卡索 155014.0
上海 樂卡索媽媽裝夏裝連衣裙大花雪紡裙中老年女裝40歲中年裙大碼裙子 139.0 1371 卡索 190569.0
上海 中老年女裝夏裝連衣裙40-50歲中年媽媽裝雪紡長裙老年人大碼裙子 69.0 2663 183747.0
上海 2017中年高檔參加婚禮媽媽裝春夏連衣裙高貴新娘喜婆婆結婚宴禮服 458.0 441 other/其他 201978.0
上海 2017新款媽媽裝夏裝短袖連衣裙蕾絲中長款4050歲中年女裝夏季裙子 138.0 461 NaN 63618.0
In [113]:
#兩個索引
df3=df.set_index(["位置","品牌"])
df3.head()
#並根據位置進行排序
#df4=df3.sort_index(level=0)
df4=df3.sort_index(level="位置")
df4.head()
Out[113]:
    寶貝 價格 成交量 銷售額
位置 品牌        
上海 NaN 中老年女裝夏裝連衣裙中年雪紡上衣媽媽裝中長款40-50歲大碼裙子 38.8 10296 399484.8
NaN 2017新款媽媽裝夏裝短袖連衣裙蕾絲中長款4050歲中年女裝夏季裙子 138.0 461 63618.0
other/其他 2017中年高檔參加婚禮媽媽裝春夏連衣裙高貴新娘喜婆婆結婚宴禮服 458.0 441 201978.0
other/其他 2017春夏新款參加婚禮媽媽裝連衣裙婚宴婆婆喜慶中老年結婚禮服 398.0 410 163180.0
樂卡索 樂卡索媽媽裝夏裝連衣裙大花雪紡裙中老年女裝40歲中年裙大碼裙子 139.0 1371 190569.0
 

groupby 分組匯總

In [126]:
#刪除不需要的數據
deal=df.drop(["寶貝","品牌","位置"],axis=1)
deal.head()
#inplace=Fals 不修改原始數據   True 修改原始數據
Out[126]:
  價格 成交量 銷售額
位置      
浙江 嘉興 148.0 9276 1372848.0
浙江 杭州 129.0 3593 463497.0
江蘇 蘇州 59.0 18569 1095571.0
上海 38.8 10296 399484.8
江蘇 蘇州 128.0 13313 1704064.0
In [127]:
deal.groupby("位置").mean()#均值
Out[127]:
  價格 成交量 銷售額
位置      
上海 181.715385 1808.307692 187735.600000
北京 105.395158 1431.463158 108372.716632
安徽 蕪湖 729.000000 148.000000 107892.000000
山東 濟南 155.857143 1566.000000 250650.857143
廣東 東莞 164.777778 826.000000 137011.333333
廣東 廣州 251.909091 635.090909 89932.181818
廣東 深圳 178.214286 1058.142857 151225.928571
江蘇 無錫 125.675000 1963.500000 197929.475000
江蘇 蘇州 100.697297 1750.261261 170828.847748
河南 商丘 178.000000 216.000000 38448.000000
河南 鄭州 68.000000 486.000000 33048.000000
浙江 嘉興 136.185000 1760.400000 230214.150000
浙江 寧波 153.750000 1888.000000 270564.750000
浙江 杭州 190.150000 1534.423077 236328.896154
浙江 紹興 380.000000 375.000000 142500.000000
浙江 金華 218.000000 1241.333333 273324.000000
湖北 武漢 140.600000 1417.200000 211603.960000
In [128]:
df["成交量"].groupby(df["位置"]).mean()
Out[128]:
位置
上海       1808.307692
北京       1431.463158
安徽 蕪湖     148.000000
山東 濟南    1566.000000
廣東 東莞     826.000000
廣東 廣州     635.090909
廣東 深圳    1058.142857
江蘇 無錫    1963.500000
江蘇 蘇州    1750.261261
河南 商丘     216.000000
河南 鄭州     486.000000
浙江 嘉興    1760.400000
浙江 寧波    1888.000000
浙江 杭州    1534.423077
浙江 紹興     375.000000
浙江 金華    1241.333333
湖北 武漢    1417.200000
Name: 成交量, dtype: float64
In [130]:
df["成交量"].groupby([df["位置"],df["品牌"]]).mean()
#按多組列進行分組
Out[130]:
位置     品牌                  
上海     other/其他                 425.500000
       卡索                     1155.750000
       千戀                   1191.000000
       茹                      1408.000000
       港                      2663.000000
       熟了                     824.000000
北京     斯岩                  2699.000000
       COOKBOOK                 541.000000
       夫人        1146.000000
       黑茉莉      559.000000
       利達         834.000000
       LIGGCOK                  550.500000
       SNOWQUEEN                272.000000
       other/其他                1624.600000
       songmay                  106.000000
       樂姿                     2174.000000
       菲瑪依                    4335.666667
       城秀                      316.000000
       璐                       780.000000
       寒斯                      237.000000
       巧爾                      372.000000
       欣諾                     3497.000000
       愛雪                      738.500000
       愛悅                     768.000000
       甘人                      327.000000
       秋涵                      749.000000
       港                       508.000000
       簡蓉                      541.000000
       紫媛                      722.000000
       羽佩                       451.000000
                                  ...     
浙江 金華  Honra萊妃             970.000000
       Loui瑞芙           1377.000000
湖北 武漢  Choph芙麗         955.500000
       ESILEE夫人         256.000000
       FIR索爾            940.500000
       OUM薇              229.000000
Name: 成交量, Length: 211, dtype: float64
 

5.數據合並

In [132]:
#創建數據
df1=df[20:30][["位置","品牌"]]
df1.head()
Out[132]:
  位置 品牌
位置    
江蘇 蘇州 江蘇 蘇州 NaN
浙江 嘉興 浙江 嘉興 NaN
江蘇 蘇州 江蘇 蘇州 孔雀
江蘇 蘇州 江蘇 蘇州 NaN
浙江 嘉興 浙江 嘉興 DUO瑩
In [133]:
df2=df[25:35][["品牌","價格","成交量"]]
df2.head()
Out[133]:
  品牌 價格 成交量
位置      
浙江 嘉興 淺戀 128.0 6787
江蘇 蘇州 NaN 69.0 6501
江蘇 蘇州 芬典 168.0 5967
北京 NaN 39.0 4241
北京 NaN 49.0 3996
In [135]:
df2.info()
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, 浙江 嘉興 to 北京
Data columns (total 3 columns):
品牌     7 non-null object
價格     10 non-null float64
成交量    10 non-null int64
dtypes: float64(1), int64(1), object(1)
memory usage: 320.0+ bytes
In [136]:
#pd.merge 根據一個或多個KEY值,將DataFrame連接(join)
#pd.concat 沿着一個軸拼接
#combine_first 如果有缺失值,另外要給數據集對其進行填充
In [143]:
pd.merge(df1,df2).head()
 Out[143]:
  位置 品牌 價格 成交量
0 江蘇 蘇州 NaN 69.0 6501
1 江蘇 蘇州 NaN 39.0 4241
2 江蘇 蘇州 NaN 49.0 3996
3 浙江 嘉興 NaN 69.0 6501
4 浙江 嘉興 NaN 39.0 4241
In [142]:
pd.merge(df1,df2,how="outer").head()#how默認為 inner 可修改為 outer left right
Out[142]:
  位置 品牌 價格 成交量
0 江蘇 蘇州 NaN 69.0 6501.0
1 江蘇 蘇州 NaN 39.0 4241.0
2 江蘇 蘇州 NaN 49.0 3996.0
3 浙江 嘉興 NaN 69.0 6501.0
4 浙江 嘉興 NaN 39.0 4241.0
In [145]:
#索引合並
pd.merge(df2,df1,left_index=True,right_index=True).head()
Out[145]:
  品牌_x 價格 成交量 位置 品牌_y
位置          
北京 NaN 39.0 4241 北京 NaN
北京 NaN 39.0 4241 北京 NaN
北京 NaN 49.0 3996 北京 NaN
北京 NaN 49.0 3996 北京 NaN
北京 other/其他 15.8 2596 北京 NaN
 

6.數據重塑

 

DataFrame 創建數據是無序的

In [2]:
import pandas as pd
df=pd.DataFrame({"日期":["2017-01-01","2017-01-02","2017-01-03","2017-02-03","2017-02-04","2017-03-01","2017-03-02"],"最高氣溫":
[12,13,14,15,16,17,15],"最低氣溫":[7,8,8,9,12,3,5],"天氣":["","多雲","多雲","小雨","小雨","",""],"風向":
["西北風","東北風","東北風","西北風","西北風","北風","南風"],"風力":[2,2,2,1,2,3,2]})
reindex 可對DataFrame 進行排序
In [157]:
df=df.reindex(["日期"]+["最高氣溫"]+["最低氣溫"]+["天氣"]+["風向"]+["風力"],axis=1)
df.head()
Out[157]:
  日期 最高氣溫 最低氣溫 天氣 風向 風力
0 2017-01-01 12 7 西北風 2
1 2017-01-02 13 8 多雲 東北風 2
2 2017-01-03 14 8 多雲 東北風 2
3 2017-02-03 15 9 小雨 西北風 1
4 2017-02-04 16 12 小雨 西北風 2
In [160]:
df.stack()#列轉化為層級的Series
Out[160]:
0  日期      2017-01-01
   最高氣溫            12
   最低氣溫             7
   天氣               晴
   風向             西北風
   風力               2
1  日期      2017-01-02
   最高氣溫            13
   最低氣溫             8
   天氣              多雲
   風向             東北風
   風力               2
2  日期      2017-01-03
   最高氣溫            14
   最低氣溫             8
   天氣              多雲
   風向             東北風
   風力               2
3  日期      2017-02-03
   最高氣溫            15
   最低氣溫             9
   天氣              小雨
   風向             西北風
   風力               1
4  日期      2017-02-04
   最高氣溫            16
   最低氣溫            12
   天氣              小雨
   風向             西北風
   風力               2
5  日期      2017-03-01
   最高氣溫            17
   最低氣溫             3
   天氣               晴
   風向              北風
   風力               3
6  日期      2017-03-02
   最高氣溫            15
   最低氣溫             5
   天氣               陰
   風向              南風
   風力               2
dtype: object
In [161]:
df.stack().unstack()#還原
Out[161]:
  日期 最高氣溫 最低氣溫 天氣 風向 風力
0 2017-01-01 12 7 西北風 2
1 2017-01-02 13 8 多雲 東北風 2
2 2017-01-03 14 8 多雲 東北風 2
3 2017-02-03 15 9 小雨 西北風 1
4 2017-02-04 16 12 小雨 西北風 2
5 2017-03-01 17 3 北風 3
6 2017-03-02 15 5 南風 2
 

數據透視表

In [ ]:
pd.pivot_table()
data,  數據集
values=None, 值是誰
index=None,  索引是誰
columns=None, 標題是誰
aggfunc='mean', 聚合的函數是誰
fill_value=None, 
margins=False, 
dropna=True,   是否召回
margins_name='All'
In [164]:
df_table=pd.pivot_table(df,index=["天氣"],columns=["風向"],values=["最高氣溫"])
df_table
 Out[164]:
  最高氣溫
風向 東北風 北風 南風 西北風
天氣        
多雲 13.5 NaN NaN NaN
小雨 NaN NaN NaN 15.5
NaN 17.0 NaN 12.0
NaN NaN 15.0 NaN
In [165]:
df_table.info()
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, 多雲 to 陰
Data columns (total 4 columns):
(最高氣溫, 東北風)    1 non-null float64
(最高氣溫, 北風)     1 non-null float64
(最高氣溫, 南風)     1 non-null float64
(最高氣溫, 西北風)    2 non-null float64
dtypes: float64(4)
memory usage: 160.0+ bytes
In [3]:
import numpy as np
In [4]:
 df=pd.DataFrame({"日期":["2017-01-01","2017-01-02","2017-01-03","2017-02-03","2017-02-04","2017-03-01","2017-03-02"],"最高氣溫":
[12,13,14,15,np.nan,17,15],"最低氣溫":[7,8,8,np.nan,12,3,5],"天氣":[np.nan,"多雲","多雲","小雨","小雨","",""],"風向":
["西北風",np.nan,"東北風","西北風",np.nan,"北風","南風"],"風力":[2,2,np.nan,1,2,3,2]})
In [5]:
df
Out[5]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 NaN 2017-01-01 7.0 12.0 2.0 西北風
1 多雲 2017-01-02 8.0 13.0 2.0 NaN
2 多雲 2017-01-03 8.0 14.0 NaN 東北風
3 小雨 2017-02-03 NaN 15.0 1.0 西北風
4 小雨 2017-02-04 12.0 NaN 2.0 NaN
5 2017-03-01 3.0 17.0 3.0 北風
6 2017-03-02 5.0 15.0 2.0 南風
 

缺失值的處理

In [7]:
df.isnull()#發現缺失值 True 為有缺失
Out[7]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 True False False False False False
1 False False False False False True
2 False False False False True False
3 False False True False False False
4 False False False True False True
5 False False False False False False
6 False False False False False False
In [9]:
df.notnull()#發現缺失值 False 為有缺失
Out[9]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 False True True True True True
1 True True True True True False
2 True True True True False True
3 True True False True True True
4 True True True False True False
5 True True True True True True
6 True True True True True True
In [10]:
 
df.dropna(axis=0) 刪除有缺失值的行
Out[10]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
5 2017-03-01 3.0 17.0 3.0 北風
6 2017-03-02 5.0 15.0 2.0 南風
In [11]:
df.dropna(axis=1)#刪除有缺失值的列
Out[11]:
  日期
0 2017-01-01
1 2017-01-02
2 2017-01-03
3 2017-02-03
4 2017-02-04
5 2017-03-01
6 2017-03-02
 

缺失值的填充

In [13]:
#用字符串填充
df.fillna("missing")
Out[13]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 missing 2017-01-01 7 12 2 西北風
1 多雲 2017-01-02 8 13 2 missing
2 多雲 2017-01-03 8 14 missing 東北風
3 小雨 2017-02-03 missing 15 1 西北風
4 小雨 2017-02-04 12 missing 2 missing
5 2017-03-01 3 17 3 北風
6 2017-03-02 5 15 2 南風
In [15]:
#使用前一個數值代替
df.fillna(method="pad")
Out[15]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 NaN 2017-01-01 7.0 12.0 2.0 西北風
1 多雲 2017-01-02 8.0 13.0 2.0 西北風
2 多雲 2017-01-03 8.0 14.0 2.0 東北風
3 小雨 2017-02-03 8.0 15.0 1.0 西北風
4 小雨 2017-02-04 12.0 15.0 2.0 西北風
5 2017-03-01 3.0 17.0 3.0 北風
6 2017-03-02 5.0 15.0 2.0 南風
In [16]:
df.fillna(method="pad",limit=1)#只向下或向上填充一個,填充過多數據不准
Out[16]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 NaN 2017-01-01 7.0 12.0 2.0 西北風
1 多雲 2017-01-02 8.0 13.0 2.0 西北風
2 多雲 2017-01-03 8.0 14.0 2.0 東北風
3 小雨 2017-02-03 8.0 15.0 1.0 西北風
4 小雨 2017-02-04 12.0 15.0 2.0 西北風
5 2017-03-01 3.0 17.0 3.0 北風
6 2017-03-02 5.0 15.0 2.0 南風
In [17]:
#向后填充
df.fillna(method="bfill")
Out[17]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 多雲 2017-01-01 7.0 12.0 2.0 西北風
1 多雲 2017-01-02 8.0 13.0 2.0 東北風
2 多雲 2017-01-03 8.0 14.0 1.0 東北風
3 小雨 2017-02-03 12.0 15.0 1.0 西北風
4 小雨 2017-02-04 12.0 17.0 2.0 北風
5 2017-03-01 3.0 17.0 3.0 北風
6 2017-03-02 5.0 15.0 2.0 南風
In [18]:
#用均值填充
df.fillna(df.mean())
Out[18]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 NaN 2017-01-01 7.000000 12.000000 2.0 西北風
1 多雲 2017-01-02 8.000000 13.000000 2.0 NaN
2 多雲 2017-01-03 8.000000 14.000000 2.0 東北風
3 小雨 2017-02-03 7.166667 15.000000 1.0 西北風
4 小雨 2017-02-04 12.000000 14.333333 2.0 NaN
5 2017-03-01 3.000000 17.000000 3.0 北風
6 2017-03-02 5.000000 15.000000 2.0 南風
In [19]:
df.fillna(df.mean()["最低氣溫":"最高氣溫"])#只填充需要填充的行數
Out[19]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 NaN 2017-01-01 7.000000 12.000000 2.0 西北風
1 多雲 2017-01-02 8.000000 13.000000 2.0 NaN
2 多雲 2017-01-03 8.000000 14.000000 NaN 東北風
3 小雨 2017-02-03 7.166667 15.000000 1.0 西北風
4 小雨 2017-02-04 12.000000 14.333333 2.0 NaN
5 2017-03-01 3.000000 17.000000 3.0 北風
6 2017-03-02 5.000000 15.000000 2.0 南風
In [21]:
df.loc[:,"最低氣溫":"最高氣溫"].fillna(df.mean())
Out[21]:
  最低氣溫 最高氣溫
0 7.000000 12.000000
1 8.000000 13.000000
2 8.000000 14.000000
3 7.166667 15.000000
4 12.000000 14.333333
5 3.000000 17.000000
6 5.000000 15.000000
 

檢測和過濾異常值

In [24]:
#參照正太分布 定義》3標准差或小於-3標准差的值為異常值
sta=(df["最高氣溫"]-df["最高氣溫"].mean())/df["最高氣溫"].std()
sta.abs()>1
Out[24]:
0     True
1    False
2    False
3    False
4    False
5     True
6    False
Name: 最高氣溫, dtype: bool
In [40]:
df["最高溫度是否異常"]=sta.abs()>1
df
Out[40]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向 最高溫度是否異常
0 NaN 2017-01-01 7.0 12.0 2.0 西北風 True
1 多雲 2017-01-02 8.0 13.0 2.0 NaN False
2 多雲 2017-01-03 8.0 14.0 NaN 東北風 False
3 小雨 2017-02-03 NaN 15.0 1.0 西北風 False
4 小雨 2017-02-04 12.0 NaN 2.0 NaN False
5 2017-03-01 3.0 17.0 3.0 北風 True
6 2017-03-02 5.0 15.0 2.0 南風 False
In [41]:
df["最高溫度是否異常"].value_counts()
Out[41]:
False    5
True     2
Name: 最高溫度是否異常, dtype: int64
In [44]:
#用箱線圖定義異常值
h=df["最高氣溫"]
iqr=h.quantile(0.75)-h.quantile(0.25)
df_max=h.quantile(0.75)+1.5*iqr
df_min=h.quantile(0.25)-1.5*iqr
 
In [45]:
df_max
Out[45]:
17.625
In [46]:
df_min
Out[46]:
10.625
In [52]:
df["isouter"]=(h>df_max)|(h<df_min)
In [53]:
df
Out[53]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向 最高溫度是否異常 isouter
0 NaN 2017-01-01 7.0 12.0 2.0 西北風 True False
1 多雲 2017-01-02 8.0 13.0 2.0 NaN False False
2 多雲 2017-01-03 8.0 14.0 NaN 東北風 False False
3 小雨 2017-02-03 NaN 15.0 1.0 西北風 False False
4 小雨 2017-02-04 12.0 NaN 2.0 NaN False False
5 2017-03-01 3.0 17.0 3.0 北風 True False
6 2017-03-02 5.0 15.0 2.0 南風 False False
 

重復值 duplicated

In [60]:
df.duplicated()
Out[60]:
0    False
1    False
2    False
3    False
4    False
5    False
6    False
dtype: bool
In [55]:
df.duplicated("風力")
Out[55]:
0    False
1     True
2    False
3    False
4     True
5    False
6     True
dtype: bool
In [57]:
d2=df.drop_duplicates("風力")#刪除有重復項的行
In [59]:
d2
Out[59]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向 最高溫度是否異常 isouter
0 NaN 2017-01-01 7.0 12.0 2.0 西北風 True False
2 多雲 2017-01-03 8.0 14.0 NaN 東北風 False False
3 小雨 2017-02-03 NaN 15.0 1.0 西北風 False False
5 2017-03-01 3.0 17.0 3.0 北風 True False
 

時間數據的處理

In [61]:
import time
 
In [62]:
time.time()#時間戳是指格林威治時間自1970年1月1日(00:00:00 gmy)至當前時間的總秒數
#北京時間1970年1月1日(08:00:00)
 Out[62]:
1572838472.6537158
In [63]:
time.localtime()
Out[63]:
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=4, tm_hour=11, tm_min=38, tm_sec=45, tm_wday=0, tm_yday=308, tm_isdst=0)
 

時間格式的轉換

In [ ]:
 
time.strftime()#format 時間格式
%Y  Year with century as a decimal number.
%m  Month as a decimal number [01,12].
%d  Day of the month as a decimal number [01,31].
%H  Hour (24-hour clock) as a decimal number [00,23].
%M  Minute as a decimal number [00,59].
%S  Second as a decimal number [00,61].
%z  Time zone offset from UTC.

%a  Locale's abbreviated weekday name.
%A  Locale's full weekday name.
%b  Locale's abbreviated month name.
%B  Locale's full month name.
%c  Locale's appropriate date and time representation.
%I  Hour (12-hour clock) as a decimal number [01,12].
%p  Locale's equivalent of either AM or PM.
time.strftime()格式化系統時間
In [64]:
time.strftime("%Y-%m-%d",time.localtime())#把當前時間轉換成可讀形式,注意轉換之后為str格式
 Out[64]:
'2019-11-04'
In [66]:
s=time.strftime("%Y-%m-%d",time.localtime())
Out[66]:
'2019-11-04'
In [69]:
type(s)
Out[69]:
str
In [195]:
d=time.strptime(s,"%Y-%m-%d")#返回datetime格式的時間
Out[195]:
time.struct_time(tm_year=2019, tm_mon=11, tm_mday=4, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=308, tm_isdst=-1)
In [196]:
type(d)
Out[196]:
time.struct_time
 

將時間戳轉換成系統時間

In [70]:
time.localtime(1533785557.0)
Out[70]:
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=9, tm_hour=11, tm_min=32, tm_sec=37, tm_wday=3, tm_yday=221, tm_isdst=0)
In [74]:
time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(1533785557.0))
Out[74]:
'2018-08-09 11:32:37'
 

時間數據的操作

In [91]:
import datetime
import pandas as pd
import numpy as np
In [80]:
#取當前datetime格式的時間
datetime.datetime(2018,8,8)
Out[80]:
datetime.datetime(2018, 8, 8, 0, 0)
In [ ]:
pd.date_range()
start=None,  開始
end=None,    結束
periods=None, 生成多少個
freq='D', 默認按天計算 
tz=None, 
normalize=False, 
name=None, 
closed=None, 
**kwargs)
 

生成時間序列數據

In [81]:
#生成時間序列數據
pd.date_range(datetime.datetime(2018,8,8),periods=4)
Out[81]:
DatetimeIndex(['2018-08-08', '2018-08-09', '2018-08-10', '2018-08-11'], dtype='datetime64[ns]', freq='D')
In [89]:
pd.date_range("2018-8,-8",periods=4)#指定生成個數
Out[89]:
DatetimeIndex(['2018-08-08', '2018-08-09', '2018-08-10', '2018-08-11'], dtype='datetime64[ns]', freq='D')
In [86]:
pd.date_range("2018-8-8","2018-9-9")#指定起始日期
Out[86]:
DatetimeIndex(['2018-08-08', '2018-08-09', '2018-08-10', '2018-08-11',
               '2018-08-12', '2018-08-13', '2018-08-14', '2018-08-15',
               '2018-08-16', '2018-08-17', '2018-08-18', '2018-08-19',
               '2018-08-20', '2018-08-21', '2018-08-22', '2018-08-23',
               '2018-08-24', '2018-08-25', '2018-08-26', '2018-08-27',
               '2018-08-28', '2018-08-29', '2018-08-30', '2018-08-31',
               '2018-09-01', '2018-09-02', '2018-09-03', '2018-09-04',
               '2018-09-05', '2018-09-06', '2018-09-07', '2018-09-08',
               '2018-09-09'],
              dtype='datetime64[ns]', freq='D')
In [88]:
 
pd.date_range("2018-8-8 11:00","2018-8-9 00:00",freq="H")#按小時生成序列
Out[88]:
DatetimeIndex(['2018-08-08 11:00:00', '2018-08-08 12:00:00',
               '2018-08-08 13:00:00', '2018-08-08 14:00:00',
               '2018-08-08 15:00:00', '2018-08-08 16:00:00',
               '2018-08-08 17:00:00', '2018-08-08 18:00:00',
               '2018-08-08 19:00:00', '2018-08-08 20:00:00',
               '2018-08-08 21:00:00', '2018-08-08 22:00:00',
               '2018-08-08 23:00:00', '2018-08-09 00:00:00'],
              dtype='datetime64[ns]', freq='H')
In [93]:
ser=pd.Series(np.arange(10),index=pd.date_range("2018-8-9",periods=10))
ser
Out[93]:
2018-08-09    0
2018-08-10    1
2018-08-11    2
2018-08-12    3
2018-08-13    4
2018-08-14    5
2018-08-15    6
2018-08-16    7
2018-08-17    8
2018-08-18    9
Freq: D, dtype: int32
In [94]:
ser["2018-8-9"]
Out[94]:
0
In [96]:
ser.index[2].year
Out[96]:
2018
In [97]:
ser.index[2].month
Out[97]:
8
In [99]:
ser.index[2].day
Out[99]:
11
 

修改日期格式

pd.to_datetime()

In [123]:
df=pd.DataFrame({"日期":["2017-01-01","2017-01-02","2017-01-03","2017-02-03","2017-02-04","2017-03-01","2017-03-02"],"最高氣溫":
[12,13,14,15,np.nan,17,15],"最低氣溫":[7,8,8,np.nan,12,3,5],"天氣":[np.nan,"多雲","多雲","小雨","小雨","",""],"風向":
["西北風",np.nan,"東北風","西北風",np.nan,"北風","南風"],"風力":[2,2,np.nan,1,2,3,2]})
In [124]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 6 columns):
天氣      6 non-null object
日期      7 non-null object
最低氣溫    6 non-null float64
最高氣溫    6 non-null float64
風力      6 non-null float64
風向      5 non-null object
dtypes: float64(3), object(3)
memory usage: 416.0+ bytes
 

format

In [125]:
df["日期"]=pd.to_datetime(df["日期"].values,format="%Y-%m-%d")
 
In [126]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 6 columns):
天氣      6 non-null object
日期      7 non-null datetime64[ns]
最低氣溫    6 non-null float64
最高氣溫    6 non-null float64
風力      6 non-null float64
風向      5 non-null object
dtypes: datetime64[ns](1), float64(3), object(2)
memory usage: 416.0+ bytes
In [109]:
df
Out[109]:
  天氣 日期 最低氣溫 最高氣溫 風力 風向
0 NaN 2017-01-01 7.0 12.0 2.0 西北風
1 多雲 2017-01-02 8.0 13.0 2.0 NaN
2 多雲 2017-01-03 8.0 14.0 NaN 東北風
3 小雨 2017-02-03 NaN 15.0 1.0 西北風
4 小雨 2017-02-04 12.0 NaN 2.0 NaN
5 2017-03-01 3.0 17.0 3.0 北風
6 2017-03-02 5.0 15.0 2.0 南風
In [130]:
#將日期設置為索引
df=df.set_index("日期")
In [131]:
df
 Out[131]:
  天氣 最低氣溫 最高氣溫 風力 風向
日期          
2017-01-01 NaN 7.0 12.0 2.0 西北風
2017-01-02 多雲 8.0 13.0 2.0 NaN
2017-01-03 多雲 8.0 14.0 NaN 東北風
2017-02-03 小雨 NaN 15.0 1.0 西北風
2017-02-04 小雨 12.0 NaN 2.0 NaN
2017-03-01 3.0 17.0 3.0 北風
2017-03-02 5.0 15.0 2.0 南風
In [117]:
  #提取1月份的數據
df_join=df[(df.index>="2017-01-01")&(df.index<="2017-02-01")]#注意時間輸入需與索引格式一致
df_join

 

Out[117]:
  天氣 最低氣溫 最高氣溫 風力 風向
日期          
2017-01-01 NaN 7.0 12.0 2.0 西北風
2017-01-02 多雲 8.0 13.0 2.0 NaN
2017-01-03 多雲 8.0 14.0 NaN 東北風
In [119]:
 df["2017-01-01":"2017-01-31"].info()
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, 2017-01-01 to 2017-01-03
Data columns (total 5 columns):
天氣      2 non-null object
最低氣溫    3 non-null float64
最高氣溫    3 non-null float64
風力      2 non-null float64
風向      2 non-null object
dtypes: float64(3), object(2)
memory usage: 144.0+ bytes
In [132]:
#轉換成月份
df.to_period("M")
Out[132]:
  天氣 最低氣溫 最高氣溫 風力 風向
日期          
2017-01 NaN 7.0 12.0 2.0 西北風
2017-01 多雲 8.0 13.0 2.0 NaN
2017-01 多雲 8.0 14.0 NaN 東北風
2017-02 小雨 NaN 15.0 1.0 西北風
2017-02 小雨 12.0 NaN 2.0 NaN
2017-03 3.0 17.0 3.0 北風
2017-03 5.0 15.0 2.0 南風
 

處理字符型數據

In [155]:
data=pd.DataFrame({"Rank":[1,2,3,4,5],"city":["london","benrlin]","madind","rome","pans"],"state":[" kingdom"," gemany","spain ","ltaly","frnce"],
"popuiation":["8,615,246","3,437,916","3,165,235","2,872,086","2,273,305"],"dateofcensusestumate":["1 june 2014","31 may 2014",
"1 january 2014","30 september 2014","1 jannany 2013"]})
In [156]:
data
Out[156]:
  Rank city dateofcensusestumate popuiation state
0 1 london 1 june 2014 8,615,246 kingdom
1 2 benrlin] 31 may 2014 3,437,916 gemany
2 3 madind 1 january 2014 3,165,235 spain
3 4 rome 30 september 2014 2,872,086 ltaly
4 5 pans 1 jannany 2013 2,273,305 frnce
In [157]:
date=data.reindex(["Rank"]+["city"]+["state"]+["popuiation"]+["dateofcensusestumate"],axis=1)#排序
In [158]:
date
Out[158]:
  Rank city state popuiation dateofcensusestumate
0 1 london kingdom 8,615,246 1 june 2014
1 2 benrlin] gemany 3,437,916 31 may 2014
2 3 madind spain 3,165,235 1 january 2014
3 4 rome ltaly 2,872,086 30 september 2014
4 5 pans frnce 2,273,305 1 jannany 2013
In [159]:
date.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 5 columns):
Rank                    5 non-null int64
city                    5 non-null object
state                   5 non-null object
popuiation              5 non-null object
dateofcensusestumate    5 non-null object
dtypes: int64(1), object(4)
memory usage: 280.0+ bytes
 

去掉逗號

 

split()分割函數

In [160]:
date["popuiation"].apply(lambda x :x.split(","))#按照逗號分隔
Out[160]:
0    [8, 615, 246]
1    [3, 437, 916]
2    [3, 165, 235]
3    [2, 872, 086]
4    [2, 273, 305]
Name: popuiation, dtype: object
In [161]:
date["popuiation"].apply(lambda x :x.replace(",",""))#把逗號替代為空
#lambda 匿名函數
#apply 循環
Out[161]:
0    8615246
1    3437916
2    3165235
3    2872086
4    2273305
Name: popuiation, dtype: object
 

replace()替換函數

In [162]:
subtr=date["popuiation"].apply(lambda x : int(x.replace(",","")))
In [163]:
date["numericpopuiation"]=subtr
date
Out[163]:
  Rank city state popuiation dateofcensusestumate numericpopuiation
0 1 london kingdom 8,615,246 1 june 2014 8615246
1 2 benrlin] gemany 3,437,916 31 may 2014 3437916
2 3 madind spain 3,165,235 1 january 2014 3165235
3 4 rome ltaly 2,872,086 30 september 2014 2872086
4 5 pans frnce 2,273,305 1 jannany 2013 2273305
In [165]:
date["state"].values# 發現數據有空格
Out[165]:
array([' kingdom', ' gemany', 'spain ', 'ltaly', 'frnce'], dtype=object)
 

strip()剔除前后空格函數

In [167]:
date["state"].apply(lambda x :x.strip())#剔除前后空格
Out[167]:
0    kingdom
1     gemany
2      spain
3      ltaly
4      frnce
Name: state, dtype: object
In [170]:
stri=date["state"].apply(lambda x :x.strip())#空格沒有了
date["stace"]=stri
date["stace"].values
Out[170]:
array(['kingdom', 'gemany', 'spain', 'ltaly', 'frnce'], dtype=object)
 

對指定字符串進行處理

 

如果我們需要在一系列文本中提取數據?

 

正則表達式通常被用來檢索某個規則的文本

In [172]:
str_1=pd.DataFrame({"title":["網名最喜歡的旅游目的地榜單出爐","讓生活更幸福是旅游業的使命","一帶一路國家中東歐游客增兩倍","旅游業改革開啟旅游強國新篇章"],
"link":["http//cntour.cninews/4221/","http//cntour.cninews/4212/","http//cntour.cninews/4202/","http//cntour.cninews/4191/"]})
In [173]:
str_1
Out[173]:
  link title
0 http//cntour.cninews/4221/ 網名最喜歡的旅游目的地榜單出爐
1 http//cntour.cninews/4212/ 讓生活更幸福是旅游業的使命
2 http//cntour.cninews/4202/ 一帶一路國家中東歐游客增兩倍
3 http//cntour.cninews/4191/ 旅游業改革開啟旅游強國新篇章
 

str.extract()運用正則表達式(表達式詳情百度查看)

注:括號里面是需要的內容

In [175]:
str_1["link"]
Out[175]:
0    http//cntour.cninews/4221/
1    http//cntour.cninews/4212/
2    http//cntour.cninews/4202/
3    http//cntour.cninews/4191/
Name: link, dtype: object
In [178]:
str_1["link"].str.extract("ews/(.+)/",expand=False)
Out[178]:
0    4221
1    4212
2    4202
3    4191
Name: link, dtype: object
In [181]:
str_2=str_1["link"].str.extract("ews/(.+)/",expand=False)
str_1["links"]=str_2
str_1
Out[181]:
  link title links
0 http//cntour.cninews/4221/ 網名最喜歡的旅游目的地榜單出爐 4221
1 http//cntour.cninews/4212/ 讓生活更幸福是旅游業的使命 4212
2 http//cntour.cninews/4202/ 一帶一路國家中東歐游客增兩倍 4202
3 http//cntour.cninews/4191/ 旅游業改革開啟旅游強國新篇章 4191
In [188]:
 dic={"4221":"","4212":"","4202":"","4191":""}
In [191]:
%%time
str_1["linkss"]=str_1["links"].map(dic)#map 映射函數,可將dic的值 根據鍵一一對應,映射到str——1
str_1
Wall time: 3 ms
  link title links linkss
0 http//cntour.cninews/4221/ 網名最喜歡的旅游目的地榜單出爐 4221
1 http//cntour.cninews/4212/ 讓生活更幸福是旅游業的使命 4212
2 http//cntour.cninews/4202/ 一帶一路國家中東歐游客增兩倍 4202
3 http//cntour.cninews/4191/ 旅游業改革開啟旅游強國新篇章 4191
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM