DataFrame數(shù)據(jù)選取全攻略

pandas庫的DataFrame烙博,作為一種非常強(qiáng)大的數(shù)據(jù)處理手段瑟蜈,一直以來無論是從整個庫的API設(shè)計(jì)和性能,都給我非常大的驚喜渣窜,但是铺根,在由生疏到慢慢熟練的過程中,發(fā)現(xiàn)在利用DataFrame時乔宿,一個最大的問題就是位迂,如何高效優(yōu)雅地選取到自己需要的數(shù)據(jù),畢竟大部分時候我們是不需要整個DataFrame中的所有數(shù)據(jù)的详瑞。而為了遵循python語言本身的設(shè)計(jì)哲學(xué)掂林,這些操作幾乎都是利用原有的運(yùn)算符,pandas只是進(jìn)行了覆寫坝橡,因而這些技能都像是隱藏的大招泻帮,難以發(fā)現(xiàn)和掌握,故特意花時間研究了一下官方文檔驳庭,現(xiàn)總結(jié)如下刑顺,見笑氯窍。

1.屬性選取

屬性選取饲常,顧名思義,也就是直接使用面向?qū)ο笏枷胫袑ο蟮膶傩赃@一特性狼讨,以進(jìn)行數(shù)據(jù)的選取贝淤,這里我們先創(chuàng)建一個示例的數(shù)據(jù)

In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: df = pd.DataFrame(np.random.randn(6, 6),
   ...:                   index=[1, 2, 'C', 'D', '5', '6'],
   ...:                   columns=['A', 'B', '3', '4', 5, 6])

注意,這里我們構(gòu)建了一個非常特殊的DataFrame政供,特別是在index和columns這兩個參數(shù)播聪,我們使用了三種分別明顯的index朽基,有int型的,字符串型兩種离陶,字符型里面又有數(shù)字和字母不一稼虎,且兩者是沒有沖突的,下面會演示這些index和columns都有啥坑(以下可能將index稱為行名招刨,columns稱為列名)霎俩。

正常情況下,使用屬性選取方式是非常簡單的沉眶,直接訪問對象屬性即可

In [4]: df.A
Out[4]:
1    0.124010
2   -1.520924
C   -1.941521
D   -0.613758
5    0.788941
6    0.894871
Name: A, dtype: float64

而如果我們訪問不存在的列打却,將會拋出AttributeError異常(為節(jié)約篇幅,以下錯誤演示去除了堆棧信息谎倔,僅保留異常信息柳击,下同)

In [5]: df.G
AttributeError: 'DataFrame' object has no attribute 'G'

當(dāng)然,屬性選取有非常大的局限性片习,首先捌肴,這種方法不能選取到行,只能選取到列

In [6]: df.C
AttributeError: 'DataFrame' object has no attribute 'C'

其次就是其對于列名也有非常嚴(yán)格的要求,首先就是如果列名與Dataframe自帶的方法毯侦、屬性名一致的列都不能使用屬性選取

In [7]: df.min
Out[7]:
<bound method DataFrame.min of           A         B         3         4
 5         6
1  0.124010 -1.160599 -1.236521 -2.356423  0.089117  1.090875
2 -1.520924 -0.285893  0.918261  1.250223  2.028298 -0.007042
C -1.941521  0.716184  0.318086 -0.540593 -2.408134  0.526977
D -0.613758  0.718741 -1.420655 -0.182436  0.333909 -1.608134
5  0.788941 -0.541419 -1.195019 -0.924797 -0.261171  1.078212
6  0.894871  0.454283 -0.763443  0.065712 -0.336119  0.182736>

再次就是由于Python的命名規(guī)則哭靖,開頭是數(shù)字的,或者帶有其他非法符號的顯然也不能使用屬性選取

In [8]: df.3
SyntaxError: invalid syntax

最后侈离,由于Python對象的動態(tài)特性试幽,如果希望通過屬性的方式添加一列,也是錯誤的

In [9]: df.G = np.arange(6)
In [10]: df
Out[10]:
          A         B         3         4         5         6
1  0.124010 -1.160599 -1.236521 -2.356423  0.089117  1.090875
2 -1.520924 -0.285893  0.918261  1.250223  2.028298 -0.007042
C -1.941521  0.716184  0.318086 -0.540593 -2.408134  0.526977
D -0.613758  0.718741 -1.420655 -0.182436  0.333909 -1.608134
5  0.788941 -0.541419 -1.195019 -0.924797 -0.261171  1.078212
6  0.894871  0.454283 -0.763443  0.065712 -0.336119  0.182736
In [11]: df.G
Out[11]: array([0, 1, 2, 3, 4, 5])

可以看到卦碾,我們只是動態(tài)地給DataFrame的實(shí)例對象加入了一個屬性铺坞,而如果該列已經(jīng)存在,是可以對該列進(jìn)行更改的

In [12]: df.A = np.arange(6)

In [13]: df
Out[13]:
   A         B         3         4         5         6
1  0 -1.160599 -1.236521 -2.356423  0.089117  1.090875
2  1 -0.285893  0.918261  1.250223  2.028298 -0.007042
C  2  0.716184  0.318086 -0.540593 -2.408134  0.526977
D  3  0.718741 -1.420655 -0.182436  0.333909 -1.608134
5  4 -0.541419 -1.195019 -0.924797 -0.261171  1.078212
6  5  0.454283 -0.763443  0.065712 -0.336119  0.182736

所以洲胖,以上就是屬性選取方法济榨,可見,由于各種限制绿映,屬性選取有著非常大的局限擒滑,同時,這種操作還很可能得到意想不到的結(jié)果叉弦,所以我個人并不推介使用這種選取的方法丐一。

2.基礎(chǔ)選取

官方文檔稱這種方式為Basic Selecte,所以這里我也稱之為基礎(chǔ)選取方式淹冰,這種方式就是直接對DataFrame對象使用[]運(yùn)算符库车,其實(shí)現(xiàn)方式是實(shí)現(xiàn)類的__getitem__魔術(shù)方法。

使用這種選取方法樱拴,非常簡單柠衍,直接將需要選取的列名放入中括號中即可

In [14]: df['A']
Out[14]:
1    0
2    1
C    2
D    3
5    4
6    5
Name: A, dtype: int32

可以看到洋满,這種方法可以非常方便地選取到一列數(shù)據(jù),而當(dāng)我們訪問不存在的列時珍坊,將會拋出KeyError牺勾,這與Python的魔術(shù)方法協(xié)議是一致的,這點(diǎn)也是我喜歡Python的原因之一阵漏,通過各種類似協(xié)議的魔術(shù)方法禽最,使得類似的操作能得到同樣的結(jié)果,比如求長度我就立刻知道應(yīng)該使用len()而不需要去猜是.length()還是.size()

In [15]: df['G']
KeyError: 'G'

其次就是袱饭,這種方法只能選取一列川无,不可以同時選取到多個列

In [16]: df[('A', 'B')]
KeyError: ('A', 'B')

同時需要注意的是,我們傳入的列名虑乖,其類型也必須和列名的類型相同

In [17]: df[3]
KeyError: 3
In [18]: df['3']
Out[18]:
1   -1.236521
2    0.918261
C    0.318086
D   -1.420655
5   -1.195019
6   -0.763443
Name: 3, dtype: float64

最后懦趋,這種方法還可以對DataFrame進(jìn)行切片,但此時是對行進(jìn)行切片

In [19]: df[:'B']
KeyError: 'B'
In [20]: df[:3]
Out[20]:
   A         B         3         4         5         6
1  0 -1.160599 -1.236521 -2.356423  0.089117  1.090875
2  1 -0.285893  0.918261  1.250223  2.028298 -0.007042
C  2  0.716184  0.318086 -0.540593 -2.408134  0.526977
In [21]: df[:'D':-1]
Out[21]:
   A         B         3         4         5         6
6  5  0.454283 -0.763443  0.065712 -0.336119  0.182736
5  4 -0.541419 -1.195019 -0.924797 -0.261171  1.078212
D  3  0.718741 -1.420655 -0.182436  0.333909 -1.608134

可以看到疹味,此時我們可以使用坐標(biāo)進(jìn)行切片仅叫,也可以輸入行名,同時切片的第三個參數(shù)也是可以使用的糙捺,但如果我們嘗試對列進(jìn)行切片诫咱,則會拋出KeyError

3.標(biāo)簽選取

標(biāo)簽選取洪灯,即嚴(yán)格使用行列名(index)進(jìn)行選取的方法坎缭,其需要使用.loc屬性

In [22]: df.loc['C']
Out[22]:
A    2.000000
B    0.716184
3    0.318086
4   -0.540593
5   -2.408134
6    0.526977
Name: C, dtype: float64

可以看到,這種方法其能夠快速選定一行签钩,而事實(shí)上掏呼,該方法可以同時定位行和列或者多行多列,此時只需要默念铅檩,先行后列憎夷,先行后列,先行后列昧旨,并使用逗號分隔

In [23]: df.loc['C', 'A']
Out[23]: 2.0
In [24]: df.loc[('C', 'D'), ('A', 'B')]
Out[24]:
   A         B
C  2  0.716184
D  3  0.718741

同時拾给,該方法可以進(jìn)行切片,并且可以行列同時進(jìn)行兔沃,需要說明的是蒋得,這里只能接受兩個參數(shù),即行和列的切片粘拾,不能使用第三個參數(shù)

In [25]: df.loc['C':'6', '3':]
Out[25]:
          3         4         5         6
C  0.318086 -0.540593 -2.408134  0.526977
D -1.420655 -0.182436  0.333909 -1.608134
5 -1.195019 -0.924797 -0.261171  1.078212
6 -0.763443  0.065712 -0.336119  0.182736
In [26]: df.loc['C':'6', '3':, -1]
IndexingError: Too many indexers

如果需要表示全部選中窄锅,比如選中所有的行创千,則必須要寫出:表示全部選中缰雇,即可以省略后面的參數(shù)入偷,默認(rèn)選中所有的列,但是械哟,需要選中所有的行時疏之,行參數(shù)不可以省略

In [27]: df.loc[:, 5]
Out[27]:
1    0.089117
2    2.028298
C   -2.408134
D    0.333909
5   -0.261171
6   -0.336119
Name: 5, dtype: float64

如果我們選擇不存在的位置,將會拋出KeyError

In [28]: df.loc['G']
KeyError: 'the label [G] is not in the [index]'

值得注意的是暇咆,該方法要求非常嚴(yán)格锋爪,其要求輸入的行列名必須與DataFrame的行列名類型一致,否則拋出KeyError

In [29]: df.loc[6]
KeyError: 'the label [6] is not in the [index]'

4.坐標(biāo)選取

大多數(shù)剛剛開始使用DataFrame的童鞋可能都非常喜歡使用坐標(biāo)來選取數(shù)據(jù)爸业,畢竟如果我們將DataFrame理解為一個二維的數(shù)組其骄,那么使用坐標(biāo)來選取就顯得非常的渾然天成,但是這時候扯旷,我們會發(fā)現(xiàn)前面說到的方法多大都需要時行名列名且要確保其類型也是一致的拯爽,這時候傳統(tǒng)的直接使用坐標(biāo)進(jìn)行選取就會失效。

如果我們?nèi)匀恍枰褂米鴺?biāo)進(jìn)行數(shù)據(jù)選取钧忽,此時就需要使用.iloc屬性

In [30]: df.iloc[0]
Out[30]:
A    0.000000
B   -1.160599
3   -1.236521
4   -2.356423
5    0.089117
6    1.090875
Name: 1, dtype: float64

與標(biāo)簽選取方法類似毯炮,這種方法也可以同時定位行和列、多行和多列耸黑,同樣是先行后列桃煎,逗號分隔

In [31]: df.iloc[0, 5]
Out[31]: 1.0908752302725568
In [32]: df.iloc[(0, 2), (2, 3)]
Out[32]:
          3         4
1 -1.236521 -2.356423
C  0.318086 -0.540593

同樣的,也支持切片大刊,使用:表示全部選中为迈,不可以有第三個參數(shù)

In [33]: df.iloc[:, :3]
Out[33]:
   A         B         3
1  0 -1.160599 -1.236521
2  1 -0.285893  0.918261
C  2  0.716184  0.318086
D  3  0.718741 -1.420655
5  4 -0.541419 -1.195019
6  5  0.454283 -0.763443

可以說,這個方法和標(biāo)簽選取的方法缺菌,其實(shí)是兩兄弟曲尸,一個是使用標(biāo)簽,一個是使用坐標(biāo)進(jìn)行選取男翰,當(dāng)然另患,如果我們選取不存在的位置,其也會非常合理地拋出IndexError

In [34]: df.iloc[7]
IndexError: single positional indexer is out-of-bounds

而如果我們輸入的參數(shù)不是整數(shù)蛾绎,此時將會拋出TypeError

In [35]: df.iloc['C']  
TypeError: cannot do positional indexing with these indexers [C] of <class 'str'> 

最后需要注意的是昆箕,這里說的坐標(biāo)都是實(shí)時的,所以租冠,我們需要注意鹏倘,不要與標(biāo)簽選取的方法混淆,標(biāo)簽選取無論該數(shù)據(jù)在表格的什么位置都能夠選取到顽爹,而定位選取則有可能給我們不一樣的結(jié)果

In [36]: df.sort_values('B').iloc[1]
Out[35]:
A    4.000000
B   -0.541419
3   -1.195019
4   -0.924797
5   -0.261171
6    1.078212
Name: 5, dtype: float64
In [37]: df.sort_values('B').loc[1]
Out[37]:
A    0.000000
B   -1.160599
3   -1.236521
4   -2.356423
5    0.089117
6    1.090875
Name: 1, dtype: float64

可以看到纤泵,即使順序打亂了,我們?nèi)阅芨鶕?jù)行名準(zhǔn)確得到對應(yīng)的行镜粤,而如果是是用坐標(biāo)捏题,那么我們得到的就是B列最小的那一行即這里的行名為5的行玻褪,所以在選擇使用標(biāo)簽選取或者是定位選取的時候,一定要明確自己的需求公荧。

5.條件篩選

當(dāng)我們需要按列篩選行的時候带射,根據(jù)上面所說的方法,直接使用[]循狰,這里是一致的

In [38]: df[df['B'] > 0]
Out[38]:
   A         B         3         4         5         6
C  2  0.716184  0.318086 -0.540593 -2.408134  0.526977
D  3  0.718741 -1.420655 -0.182436  0.333909 -1.608134
6  5  0.454283 -0.763443  0.065712 -0.336119  0.182736

而按行篩選列時窟社,則有一點(diǎn)不同,正確的方法是

In [39]: df.loc[:, df.loc['C'] > 0]
Out[39]:
   A         B         3         6
1  0 -1.160599 -1.236521  1.090875
2  1 -0.285893  0.918261 -0.007042
C  2  0.716184  0.318086  0.526977
D  3  0.718741 -1.420655 -1.608134
5  4 -0.541419 -1.195019  1.078212
6  5  0.454283 -0.763443  0.182736

是否覺得很詭異绪钥,這里我們可以探究一下pandas是如何實(shí)現(xiàn)這個篩選邏輯的

In [40]: df['B'] > 0
Out[40]:
1    False
2    False
C     True
D     True
5    False
6     True
Name: B, dtype: bool
In [41]: df.loc['C'] > 0
Out[41]:
A     True
B     True
3     True
4    False
5    False
6     True
Name: C, dtype: bool

可以看到灿里,當(dāng)我們?nèi)〕鲆涣羞M(jìn)行大小判斷時,其返回的是所有的行的判斷結(jié)果(Series對象)程腹,而如果我們對一行進(jìn)行判斷钠四,則返回的是各個列的判斷結(jié)果,即pandas通過覆寫大小判斷運(yùn)算符將判斷操作自動擴(kuò)展至對象中的每個元素跪楞,這點(diǎn)和R的邏輯是契合的缀去。而上面我們也說到過,當(dāng)我們使用的是[]進(jìn)行切片時甸祭,我們是對行進(jìn)行切片缕碎,而這里,我們剛好就填入了行的判斷結(jié)果(In [40])池户,所以咏雌,如果我們輸入的切片參數(shù)是Series對象時,pandas將切出被判斷為True的行校焦。對列進(jìn)行篩選的操作也是同樣的赊抖,只不過先行后列,所以前面我們需要:來表示我們選中所有的行寨典,同時也就意味著氛雪,使用.loc時,可以同時對行和列進(jìn)行篩選耸成,只需要同時給出判斷結(jié)果即可

In [42]: df.loc[df['B'] > 0, df.loc['C'] > 0]
Out[42]:
   A         B         3         6
C  2  0.716184  0.318086  0.526977
D  3  0.718741 -1.420655 -1.608134
6  5  0.454283 -0.763443  0.182736

到這里报亩,相信這個篩選操作就比較好理解了,但是有一點(diǎn)需要注意的是井氢,我們不能使用定位方法進(jìn)行篩選

In [43]: df.iloc[1] > 0
Out[43]:
A     True
B    False
3     True
4     True
5     True
6    False
Name: 2, dtype: bool

可以看到弦追,即使我們使用定位方法選中的行列并進(jìn)行判斷后,其仍然使用標(biāo)簽進(jìn)行定位花竞,所以我們可以知道劲件,在pandas的設(shè)計(jì)當(dāng)中,標(biāo)簽定位的優(yōu)先級是大于坐標(biāo)定位的,因而在使用pandas庫時零远,應(yīng)該轉(zhuǎn)變思想苗分,要將理念從二維數(shù)組中跳脫出來,將pandas理解為一個更像數(shù)據(jù)庫的存在遍烦。

最后,也就是多條件聯(lián)合篩選躺枕,由于python內(nèi)置的布爾運(yùn)算符andor不可以進(jìn)行覆寫服猪,而此時又需要將布爾運(yùn)算擴(kuò)展至每個元素,因而pandas覆寫了&|這兩個運(yùn)算符拐云,寫過其他語言的小伙伴應(yīng)該不陌生罢猪,要注意的是,這里只需要寫一次叉瘩,不像Java等需要寫兩次膳帕。

In [44]: df[(df['B'] > 0) & (df['3'] > 0)]
Out[44]:
   A         B         3         4         5         6
C  2  0.716184  0.318086 -0.540593 -2.408134  0.526977
In [45]: df.loc[:, (df.loc['C'] > 0) | (df.loc['5'] > 0)]
Out[45]:
   A         B         3         6
1  0 -1.160599 -1.236521  1.090875
2  1 -0.285893  0.918261 -0.007042
C  2  0.716184  0.318086  0.526977
D  3  0.718741 -1.420655 -1.608134
5  4 -0.541419 -1.195019  1.078212
6  5  0.454283 -0.763443  0.182736

需要注意的是,由于只有進(jìn)行判斷結(jié)束返回的Series對象薇缅,才可以進(jìn)行布爾運(yùn)算危彩,所以這里需要給每個判斷條件加上小括號以提高運(yùn)算優(yōu)先級。

6.總結(jié)

最后泳桦,結(jié)合上述內(nèi)容和我個人的使用經(jīng)驗(yàn)汤徽,總結(jié)一些我個人最佳實(shí)踐

  1. 數(shù)據(jù)在讀取時就需要進(jìn)行處理,首先一點(diǎn)就是應(yīng)該將每一行作為一個樣本灸撰,一列作為一個特征谒府,由于大多數(shù)時候是根據(jù)屬性對樣本進(jìn)行篩選,所以此時篩選起來就會更加的便捷浮毯。(df.T可以獲得經(jīng)過轉(zhuǎn)置的DataFrame即行列交換)
  2. 每一個樣本即每一行都必須使用唯一的index(行名)完疫,這一點(diǎn)有點(diǎn)數(shù)據(jù)庫的主鍵的意思,這樣就能保證我們能準(zhǔn)確選到我們需要的數(shù)據(jù)债蓝,至于列名壳鹤,如果根據(jù)前面的規(guī)則,則應(yīng)該不會存在相同的特征饰迹,且全部行名和列名統(tǒng)一為一種類型器虾,推介字符串類型。
  3. 當(dāng)需要選中一列時蹦锋,直接使用df[col]的方法選中一列兆沙,而需要選中一行的時候,直接使用df.loc[row]來選中一行莉掂。
  4. 在任何操作中盡可能避免使用坐標(biāo)進(jìn)行定位葛圃。
  5. 當(dāng)需要同時對行列進(jìn)行操作時,使用df.loc[row, loc]并在心里默念先行后列,同時库正,這種方式的參數(shù)比較多樣曲楚,可以輸入判斷結(jié)果,也可輸入單個行列名或者包含多個行列名的列表褥符,可以按需選擇龙誊。
  6. 更多待補(bǔ)充。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喷楣,一起剝皮案震驚了整個濱河市趟大,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铣焊,老刑警劉巖逊朽,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異曲伊,居然都是意外死亡叽讳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門坟募,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岛蚤,“玉大人,你說我怎么就攤上這事懈糯∶鹈溃” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵昂利,是天一觀的道長届腐。 經(jīng)常有香客問我,道長蜂奸,這世上最難降的妖魔是什么犁苏? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮扩所,結(jié)果婚禮上围详,老公的妹妹穿的比我還像新娘。我一直安慰自己祖屏,他們只是感情好助赞,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袁勺,像睡著了一般雹食。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上期丰,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天群叶,我揣著相機(jī)與錄音吃挑,去河邊找鬼。 笑死街立,一個胖子當(dāng)著我的面吹牛舶衬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赎离,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼逛犹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梁剔?” 一聲冷哼從身側(cè)響起虽画,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憾朴,沒想到半個月后狸捕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喷鸽,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡众雷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了做祝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾省。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖混槐,靈堂內(nèi)的尸體忽然破棺而出编兄,到底是詐尸還是另有隱情,我是刑警寧澤声登,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布狠鸳,位于F島的核電站,受9級特大地震影響悯嗓,放射性物質(zhì)發(fā)生泄漏件舵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一脯厨、第九天 我趴在偏房一處隱蔽的房頂上張望铅祸。 院中可真熱鬧,春花似錦合武、人聲如沸临梗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盟庞。三九已至,卻和暖如春汤善,著一層夾襖步出監(jiān)牢的瞬間茫经,已是汗流浹背巷波。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卸伞,地道東北人抹镊。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像荤傲,于是被迫代替她去往敵國和親垮耳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容