數(shù)據(jù)預(yù)處理(python&R)&讀書筆記1(R語言):

python部分

1.缺失值處理:

##pandas中讀取文件時: xlsx不容易出現(xiàn)編碼錯誤
csv文件可以先用df讀取在存成xlsx操作,如果讀取csv文件在存成csv文件容易出現(xiàn)編碼錯誤

##另外如果是文本文件,讀取時用Python strip() 方法移除字符串頭尾指定的字符(默認為空格)昆淡。否則切詞以后結(jié)果可能帶有大量的空格和換行狡相。

pandas的數(shù)據(jù)框中缺失值會用NaN(Not a Number)表示


數(shù)據(jù).png
import pandas as pd
df = pd.read_csv('Demand.csv',encoding='gbk')
數(shù)據(jù)2.png

如果DataFrame對象包含的數(shù)據(jù)很多员寇,人工來查找NaN就不現(xiàn)實了羽戒。我們可以使用isnull方法來返回一個值為布爾類型的DataFrame歼冰,判斷每個元素是否缺失,如果元素缺失剧腻,值為True拘央。然后使用sum方法,我們就能得到DataFrame中每一列的缺失值個數(shù)书在。

df.isnull().sum()
缺失值個數(shù).png

ps:由DataFrame數(shù)據(jù)框很容易得到NumPy數(shù)組灰伟,直接通過values屬性即可,然后就可以用sklearn中的算法了:


數(shù)據(jù)轉(zhuǎn)換.png

1.直接刪除帶有缺失值的特征

刪除行.png
刪除列.png

dropna方法包含多個參數(shù)儒旬,這裡介紹三個:

##去掉所有值為NaN的行栏账,默認為how ='any'
df.dropna(how ='all')
##留下五個以上非缺失值的行/去掉五個以下非缺失值的行
df.dropna(thresh = 5)
#按照“content”列中的空白部分來刪除對應(yīng)的行
df.dropna(subset=["content"])
thresh

2.插入值

插入值有很多方法:例如拉格朗日插值法,用於分類的數(shù)據(jù)可以用smote算法生成樣本栈源,最常用的是均值插入或者中位數(shù)插入挡爵。
pandas中使用fillna()完成插補,例如:插補0:df.fillna(0)甚垦,使用字典對指定列進行插補:df.fillna({1:0.5,3:-0.5})茶鹃,均值插補:data = pd.
Series([103,112,NA,121,98,NA])
data.fillna(data.mean())
這裡介紹均值插入,使用sklearn中的Imputer類能很容易實現(xiàn)此方法:
先介紹一下主要參數(shù)
missing_values:缺失值艰亮,可以為整數(shù)或NaN(缺失值numpy.nan用字符串‘NaN’表示)闭翩,默認為NaN
strategy:替換策略,字符串迄埃,默認用均值‘mean’替換
①若為mean時疗韵,用特征列的均值替換
②若為median時,用特征列的中位數(shù)替換
③若為most_frequent時侄非,用特征列的眾數(shù)替換
axis:指定軸數(shù)蕉汪,默認axis=0代表列,axis=1代表行
copy:設(shè)置為True代表不在原數(shù)據(jù)集上修改逞怨,設(shè)置為False時者疤,就地修改,存在如下情況時骇钦,即使設(shè)置為False時宛渐,也不會就地修改

from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
imr = imr.fit(df)
imputed_data = imr.transform(df.values)
填充均值

先計算每一列的平均值,然后用相應(yīng)列的平均值來替換NaN眯搭。如果將參數(shù)axis=0改為axis=1窥翩,則會計算每個樣本的所有特征(行)的平均值。
這個數(shù)據(jù)最後一行只有一格數(shù)鳞仙,應(yīng)該先用上面的方法刪除最後一行寇蚊,再做填充。

2.正則表達式的一些例子(方便以后查閱)

正則.png

R部分

缺失值處理:

#讀入文件
> setwd("C:/Users/CuiShan/Desktop/aaa")
> getwd()
[1] "C:/Users/CuiShan/Desktop/aaa"
>matrix = read.csv("Demand.csv")
數(shù)據(jù).png
#需要用到VIM和mice包
install.packages(c("VIM","mice")) 
> which(is.na(matrix))  #返回缺失值的位置
> sum(is.na(matrix)) #計算數(shù)據(jù)集中的缺失值總數(shù)
> sum(complete.cases(matrix)) #統(tǒng)計數(shù)據(jù)集中完整樣本的個數(shù)(即縮小矩陣到max(a*b)以後可以為一個完整的矩陣)
缺失值信息

1.識別缺失值

#函數(shù)is.na(),is.nan()和is.infinite()可以分別用來識別缺失值、不可能值、無窮值。
#返回結(jié)果為TRUE或FALSE俺泣,這個不做演示了

#列出沒有缺失值的行
matrix[complete.cases(matrix), ]

#列出有一個或多個缺失值的行
matrix[!complete.cases(matrix),]
沒有缺失值

一個或多個缺失值
#由於邏輯值TRUE和FALSE分別等價于數(shù)值1和0扒怖,
#可用sum()和mean()函數(shù)來獲取關(guān)於缺失值數(shù)據(jù)的有用信息较锡。
 sum(is.na(matrix$GDP))
mean(is.na(matrix$GDP))
mean(!complete.cases(matrix))#0.4375
#可以通過md.pattern()獲取缺失值的分布情況(mice包),
#其中1表示沒有缺失數(shù)據(jù)盗痒,0表示存在缺失數(shù)據(jù),最后一行給出了每個變量中缺失值的數(shù)目:
> library(mice)
> md.pattern(matrix)
##第一行代表無缺失值的模型蚂蕴,
#第二行代表一個缺失值(以此類推,如果沒有則跳過)俯邓,
#最後一列代表該模式缺失值的個數(shù)骡楼,第一列表示各缺失值模式的實例個數(shù),
#例如:第一列為9511稽鞭,9就表示無缺失值的實例(行)個數(shù)有9個鸟整,
#5就表示有一個缺失值的的實例(行)個數(shù)有1個

2.缺失值可視化

##因為不能顯示中文,所以縱坐標只有一個GDP正常顯示
##第一張圖可以看出除了第一項是全的朦蕴,每項都缺失至少一個篮条,
##倒數(shù)第二項缺了7個
##第二張圖,說明有9行沒有缺失值梦重,有5行有一個缺失值兑燥,
#有1行有兩個缺失值,有1行有10個缺失值
#對應(yīng)上面的md.pattern(matrix)顯示的9511
aggr(matrix,prop=FALSE,numbers=TRUE)
##prop=TRUE琴拧,用比例代替計數(shù)
aggr(matrix,prop=TRUE,numbers=TRUE)
##消去數(shù)值型標籤numbers=FALSE位默認值
aggr(matrix,prop=TRUE,numbers=FALSE)
aggr1
aggr2

aggr3
##淺色表示值小,深色表示值大嘱支,紅色為缺失值
matrixplot(matrix)
##另外還有marginplot()等等不做演示
matrixplot

3直接刪除&簡單插補

#直接刪除有缺失值的列蚓胸、行
a = t(na.omit(t(matrix)))#列
b = t(na.omit(matrix))#行
#或者用DMwR包實現(xiàn)
> library(VIM)
> library(DMwR)
>sum(!complete.cases(matrix))#查看含有缺失值的樣本個數(shù)(個數(shù)為7)
#直接刪除所有含有缺失值的行列
>matrix1<-na.omit(matrix)
#直接刪除缺失值過多的特征(列)或者實例(行)缺失值個數(shù)大于列數(shù)的20%  
>matrix2<-matrix[-manyNAs(matrix,0.2),]#數(shù)據(jù)框的“刪除行”操作 
>sum(!complete.cases(matrix2)) #再次查看結(jié)果(個數(shù)6,刪除了一行)

其中,函數(shù)manyNAs(x,nORp)用來查找數(shù)據(jù)框x中缺失值過多(≥缺失比例nORp)的行除师,nORp默認為0.2沛膳,即缺失值個數(shù)≥列數(shù)的20%。

按列刪

按行刪
刪除所有含有缺失值的行列
刪除缺失值達到20%的行
ps:
x<-c(1,2,3,NA,5) 
 mean(x)#默認不忽略NA值或NaN值汛聚,注意與NULL的區(qū)別
 [1] NA  
mean(x,na.rm=TRUE)#忽略缺失值
 [1] 2.75 
#簡單插補就是用某個值(如均值锹安,中位數(shù),眾數(shù)等等)替換缺失值
#缺失值全部填充0
matrix[is.na(matrix)]<-0
#均值倚舀,中位數(shù)叹哭,特定數(shù)填充,用Hmisc中的impute
#因為中文無法識別痕貌,這裡取能識別的一列GDP
library(Hmisc) 
matrix$GDP=impute(matrix$GDP, mean)  #插補均值
matrix$GDP=impute(matrix$GDP, median) #插補中位數(shù) 
matrix$GDP=impute(matrix$GDP, 20.2)  #填充特定值 
matrix$GDP[is.na(matrix$GDP)]  <-mean(matrix$GDP, na.rm=T)#手動插補均值
##ps:R語言中沒有直接求眾數(shù)的函數(shù)风罩,可用sort(table(x))先求頻數(shù)再排序觀察到,再用特定值填充舵稠。
插入0.png
均值填充1

均值填充2

其餘方法超升,以後再補充入宦。附錄圖片來自百度文庫


附錄

讀書筆記1(R語言)

很久不用R語言和matlab,這裡重新看書梳理一下R中比較重要的內(nèi)容,方便以後查閱室琢。w3cschool和R語言實戰(zhàn)里的教程也比較詳細乾闰,筆記里沒有細節(jié)部分可以上去查閱。

1 對象的類型和屬性

R的所有對象都有兩個內(nèi)在屬性:類型和長度盈滴。
類型是對象元素的基本種類涯肩,共四種:數(shù)值型(整型,單精度實型雹熬,雙精度實型)宽菜,字符型,復(fù)數(shù)型竿报,邏輯型(FALSE铅乡、TRUE、NA)烈菌。NA表示缺失數(shù)據(jù)(Not Available 所有類型的缺失值都用NA表示)

長度是對象中元素的數(shù)目阵幸。對象的類型和長度可以分別通過mode()和length()得到。

> x<-1;A<-"R language";compar<-TRUE;z<-1i
> mode(x);mode(A);mode(compar);mode(z)
[1] "numeric"
[1] "character"
[1] "logical"
[1] "complex"
> length(x);length(A);length(compar);length(z)
[1] 1
[1] 1
[1] 1
[1] 1

R可以正確地表示無窮的數(shù)值芽世,正無窮/負無窮(Inf/-Inf)例如x <- 8/0那麼x <- Inf挚赊;用NaN(not a number)表示不是數(shù)字的值例如:Inf-Inf或者sqrt(-5)或者0/0

2 對象信息的瀏覽和刪除

ls() 顯示內(nèi)存中的對象名字
ls(pattern = "A")顯示對象名字中包含指定字符的對象,這裡是A
ls(pattern = "^c")以某字母開頭的對象
ls.str()顯示內(nèi)存中所有對象的詳細信息
rm(A)刪除對象A
rm(list =ls())刪除所有對象
清理控制臺:Ctrl + L
運行:Ctrl + R

> ls()
[1] "A"      "compar" "x"      "z"     
> ls(pattern="A")
[1] "A"
> ls(pattern = "c")
[1] "compar"
> ls.str()
A :  chr "R language"
compar :  logi TRUE
x :  num Inf
z :  cplx 0+1i
> rm(A)
> ls()
[1] "compar" "x"      "z"     
> rm(list =ls())
> ls()
character(0)

3 向量對象

數(shù)值型向量對象

在統(tǒng)計分析中济瓢,最為常用的數(shù)值型荠割,可以用以下四種函數(shù)建立:

  1. seq()或者 “:” #若向量具有較為簡單的規(guī)律
  2. rep() #若向量具有較為複雜的規(guī)律
  3. c() #沒有規(guī)律
  4. scan() #通過鍵盤逐個輸入

例如:

> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10
> 1:10-1   #每個元素-1
 [1] 0 1 2 3 4 5 6 7 8 9
> 1:(10-1)
[1] 1 2 3 4 5 6 7 8 9
> z <- seq(1,5,by = 0.5)  #等價于seq(from = 1, to = 5 ,by = 0.5)
> z
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> z <- seq(1,10,length = 11) #等價于seq(1,10,length.out = 11) 把1-10拆成11個數(shù)
> z
 [1]  1.0  1.9  2.8  3.7  4.6  5.5  6.4  7.3  8.2  9.1 10.0
> z <- rep(2:5,2)  #rep(重複對象,重複次數(shù))旺矾,等價于rep(2:5,times = 2)
> z
[1] 2 3 4 5 2 3 4 5
#> rep(1:2,1:2) 
#[1] 1 2 2
#重複對象對應(yīng)重複次數(shù)也就是1重複1次蔑鹦,2重複兩次,一一對應(yīng)箕宙,前後隊列應(yīng)該長度相等
#例如:
> rep(1:2,2:3)
[1] 1 1 2 2 2
> z <- rep(2:5,rep(2,4))
> z
[1] 2 2 3 3 4 4 5 5
> z <- rep(1:3,time = 4,each = 2)
> z
 [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
> z <- x <- c(42,7,64,9)
> z
[1] 42  7 64  9
> z <- scan()     #通過鍵盤建立向量嚎朽,手動輸入元素
1: 1
2: 0.1
3: 4.4
4: 222
5: 2.0 3.0 5.2
8: 
Read 7 items
> z
[1]   1.0   0.1   4.4 222.0   2.0   3.0   5.2
> z <- sequence(3:5)
> z
 [1] 1 2 3 1 2 3 4 1 2 3 4 5
> z <- sequence(c(10,5)) #1到10,1到5
> z
 [1]  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5

字符型向量對象

字符串在輸入時使用單引號或者雙引號。如果字符里有引號需要用到轉(zhuǎn)義字符\柬帕,應(yīng)該寫為"哟忍。字符向量可以通過函數(shù)c()連接,函數(shù)paste()可以接受任意個參數(shù)陷寝,并從它們中逐個去出字符并連成字符串锅很,形成的字符串個數(shù)與參數(shù)中最長字符串的長度相同。
默認情況下盼铁,參數(shù)中的字符串是被一個空格分隔的粗蔚,通過修改參數(shù)sep= string,可以更改為其他字符串饶火。

> z <- c("green","blue sky","=88")
> z
[1] "green"    "blue sky" "=88"     
> labs <- paste(c("X","Y"),1:10,sep=",")
> labs
 [1] "X,1"  "Y,2"  "X,3"  "Y,4"  "X,5"  "Y,6"  "X,7"  "Y,8"  "X,9"  "Y,10"
> labs <- paste(c("X","Y"),1:10,sep="")
> labs
 [1] "X1"  "Y2"  "X3"  "Y4"  "X5"  "Y6"  "X7"  "Y8"  "X9"  "Y10"
> labs <- paste(c("X","Y"),1:10,sep=" ")
> labs
 [1] "X 1"  "Y 2"  "X 3"  "Y 4"  "X 5"  "Y 6"  "X 7"  "Y 8"  "X 9"  "Y 10"

邏輯型向量

共三個TRUE,FALSE和NA
前兩個可簡寫為T和F鹏控,轉(zhuǎn)化為數(shù)字向量是TRUE當做1致扯,F(xiàn)ALSE當做0。

> x <- c(10.4,5.6,3.1,6.8,16.5)
> temp <- x >12
> temp
[1] FALSE FALSE FALSE FALSE  TRUE

temp就是一個邏輯型向量

因子型向量

數(shù)值型向量的運算

向量可以用於算術(shù)表達式当辐,操作是按照向量中的元素一個一個進行的抖僵。同一個表達式中的向量并不需要具有相同的長度,如果長度不同缘揪,表達式的結(jié)果是一個長度和長向量相同的向量耍群,表達式中較短的向量會根據(jù)它的長度被重複使用若干次(不一定是整數(shù)次),直到與長度最長的向量相匹配找筝,而常數(shù)被不斷重複蹈垢,這被稱為循環(huán)法則。

> x <- c(10.4,5.6,3.1,6.4,21.7)
> y <- c(x,0,x)
> v <- 2*x+y+1
Warning message:
In 2 * x + y :
  longer object length is not a multiple of shorter object length(長的對象長度不是短的對象長度的整數(shù)倍)
> v
 [1] 32.2 17.8 10.3 20.2 66.1 21.8 22.6 12.8 16.9 50.8 43.5
> y
 [1] 10.4  5.6  3.1  6.4 21.7  0.0 10.4  5.6  3.1  6.4 21.7

產(chǎn)生一個長度為11的新向量袖裕,其中2*x被重複2次曹抬,y被重複1次,常數(shù)1倍重複11次急鳄。

向量運算:
(1)向量和一個常數(shù)加減乘除都是對向量中每個元素進行的谤民,乘方(^)開方(sqrt)也一樣,另外log,exp,sin,cos,tan等普通運算函數(shù)同樣適用
(2)同樣長度向量的基本運算為對應(yīng)元素進行相應(yīng)運算
(3)不同長度的向量加減乘除遵從循環(huán)法則疾宏,但是要注意這種情況通常要求向量的長度為倍數(shù)關(guān)係张足,否則會出現(xiàn)上面的警告

> 1:2 + 1:4
[1] 2 4 4 6
> 1:4 + 1:7
[1]  2  4  6  8  6  8 10
Warning message:
In 1:4 + 1:7 :
  longer object length is not a multiple of shorter object length

4 常用統(tǒng)計函數(shù)

具體見R語言實戰(zhàn)第五章,有圖表

向量的下標和子集的提取

(1)正整數(shù)向量坎藐,提取對應(yīng)元素为牍。
(2)負整數(shù)向量,去掉向量中與索引向量對應(yīng)的元素岩馍。
(3)字符串向量吵聪,這種可能性只存在于擁有names屬性的向量。(類似python中的字典兼雄,java中的哈希表)
(4)邏輯向量,去除滿足條件的元素帽蝶。取出所有返回值為TRUE的元素赦肋。

#(1)取
> x <- c(4,2,3,5,3,7)
> x[1:4]
[1] 4 2 3 5
> y <- x[c(1,3)]
> y
[1] 4 3
#(2)去
> y <- x[-(1:4)]
> y
[1] 3 7
#(3)
> fruit <- c(50,80,10,30)
> names(fruit)<-c("orange","banana","apple","peach")
> fruit
orange banana  apple  peach 
    50     80     10     30 
> lunch <- fruit[c("apple","orange")]
> lunch
 apple orange 
    10     50 
(4)邏輯向量
> x <- c(50,20,30,56)
> x>30
[1]  TRUE FALSE FALSE  TRUE
> x[x>30]
[1] 50 56
> x[x<50&x>30]
numeric(0)   #因為沒有符合條件的數(shù),所以顯示狀態(tài)
> x[x>30]<-28
> x
[1] 28 20 30 28
> y = runif(100,min = 0,max = 1)##在(0,1)上100個均勻分佈隨機數(shù)
> sum(y<0.5)#值小於0.5的元素的個數(shù)
[1] 53
> sum(y[y<0.5])#值小於0.5的元素之和
[1] 12.86025
> y <- x[!is.na(x)] #x中的非缺失值
> z <- x[(!is.na(x))&(x>0)]
> y
[1] 28 20 30 28
> z
[1] 28 20 30 28

5 數(shù)組與矩陣對象

數(shù)組的建立

R中的數(shù)組由函數(shù)array()建立励稳,其一般格式為

 > array(data,dim,dimnames)

其中data為向量佃乘,其元素用來構(gòu)建數(shù)組,dim為數(shù)組的維數(shù)驹尼,dimnames為各維的名稱趣避,缺省為空。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末新翎,一起剝皮案震驚了整個濱河市程帕,隨后出現(xiàn)的幾起案子住练,更是在濱河造成了極大的恐慌,老刑警劉巖愁拭,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讲逛,死亡現(xiàn)場離奇詭異,居然都是意外死亡岭埠,警方通過查閱死者的電腦和手機盏混,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惜论,“玉大人许赃,你說我怎么就攤上這事」堇啵” “怎么了混聊?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹦掐。 經(jīng)常有香客問我技羔,道長,這世上最難降的妖魔是什么卧抗? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任藤滥,我火速辦了婚禮,結(jié)果婚禮上社裆,老公的妹妹穿的比我還像新娘拙绊。我一直安慰自己,他們只是感情好泳秀,可當我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布标沪。 她就那樣靜靜地躺著,像睡著了一般嗜傅。 火紅的嫁衣襯著肌膚如雪金句。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天吕嘀,我揣著相機與錄音违寞,去河邊找鬼。 笑死偶房,一個胖子當著我的面吹牛趁曼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棕洋,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼挡闰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摄悯,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤赞季,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后射众,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碟摆,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年叨橱,在試婚紗的時候發(fā)現(xiàn)自己被綠了典蜕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡罗洗,死狀恐怖愉舔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伙菜,我是刑警寧澤轩缤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站贩绕,受9級特大地震影響火的,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜淑倾,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一馏鹤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娇哆,春花似錦湃累、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至勃黍,卻和暖如春宵统,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背覆获。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工榜田, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锻梳。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像净捅,于是被迫代替她去往敵國和親疑枯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,937評論 2 361