pandas文本處理的3大秘訣

公眾號(hào):尤而小屋
作者:Peter
編輯:Peter

大家好会油,我是Peter~

本文主要介紹的是通過(guò)使用Pandas中3個(gè)字符串相關(guān)函數(shù)來(lái)篩選滿足需求的文本數(shù)據(jù):

  • contains :包含某個(gè)字符
  • startswith:以字符開(kāi)頭
  • endswith:以字符結(jié)尾
image

模擬數(shù)據(jù)

import pandas as pd
import numpy as np
df = pd.DataFrame({
    "name":["xiao ming","Xiao zhang",np.nan,"sun quan","guan yu"],
    "age":["22","19","20","34","39"],
    "sex":["male","Female","female","Female","male"],
    "address":["廣東省深圳市","浙江省杭州市","江蘇省蘇州市","福建省泉州市","廣東省廣州市"]
})

df
image
df.dtypes  # 查看字段類型
name       object
age        object
sex        object
address    object
dtype: object

在本次模擬的數(shù)據(jù)中力图,有4個(gè)特點(diǎn):

  1. name字段:存在缺失值np.nan宿百,且Xiao和xiao存在大小寫(xiě)之分
  2. age:年齡字段蔓搞,正常應(yīng)該是數(shù)值型捞蚂,模擬的數(shù)據(jù)是字符類型object
  3. sex:也存在F和f的大小寫(xiě)之分
  4. address:正常寫(xiě)法

數(shù)據(jù)類型轉(zhuǎn)換

我們將age字段的字符類型型轉(zhuǎn)成數(shù)值型

df["age"] = df["age"].astype(float)
df

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

生成的數(shù)據(jù)如下剪侮,似乎和原始數(shù)據(jù)沒(méi)有區(qū)別金赦;但是我們查看屬性字段的數(shù)據(jù)類型就會(huì)看到區(qū)別:

image
df.dtypes
name        object
age        float64  
sex         object
address     object
dtype: object

age字段已經(jīng)轉(zhuǎn)成了float64位的數(shù)值型音瓷。

contains

contains是用于Series數(shù)據(jù)的函數(shù),基本語(yǔ)法如下:

Series.str.contains(
    pat, 
    case=True, 
    flags=0, 
    na=None, 
    regex=True
)
  • pat:傳入的字符或者正則表達(dá)式
  • case:是否區(qū)分大小寫(xiě)(對(duì)大小寫(xiě)敏感)
  • flags:正則標(biāo)志位夹抗,比如:re.IGNORECASE绳慎,表示忽略大小寫(xiě)
  • na:可選項(xiàng),標(biāo)量類型漠烧;對(duì)原數(shù)據(jù)中的缺失值處理杏愤,如果是object-dtype, 使用numpy.nan 代替;如果是StringDtype, 用pandas.NA
  • regex:布爾值已脓;True:傳入的pat看做是正則表達(dá)式珊楼,F(xiàn)alse:看做是正常的字符類型的表達(dá)式

默認(rèn)情況

# 例子1:篩選包含xiao的數(shù)據(jù)

df["name"].str.contains("xiao")
0     True
1    False
2      NaN
3    False
4    False
Name: name, dtype: object

當(dāng)屬性中存在缺失值的時(shí)候,需要帶上na參數(shù):

缺失值處理

# 例子2:參數(shù)na使用

df[df["name"].str.contains("xiao",na=False)]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
</tbody>
</table>

</div>

如果不帶上則會(huì)報(bào)錯(cuò):

df[df["name"].str.contains("xiao")]
image

忽略大小寫(xiě)

# 例子3:case使用

df["name"].str.contains("xiao",case=False)
0     True
1     True
2      NaN
3    False
4    False
Name: name, dtype: object

上面的結(jié)果直接忽略了大小寫(xiě)摆舟,可以看到出現(xiàn)了兩個(gè)True:也就是xiao和Xiao的數(shù)據(jù)都被篩選出來(lái):

df[df["name"].str.contains("xiao",case=False, na=False)]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>1</th>
<td>Xiao zhang</td>
<td>19.0</td>
<td>Female</td>
<td>浙江省杭州市</td>
</tr>
</tbody>
</table>

</div>

忽略大小寫(xiě)和缺失值

# 例子4:忽略大小寫(xiě)和缺失值
df[df["sex"].str.contains("f",case=False, na=False)]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>1</th>
<td>Xiao zhang</td>
<td>19.0</td>
<td>Female</td>
<td>浙江省杭州市</td>
</tr>
<tr>
<th>2</th>
<td>NaN</td>
<td>20.0</td>
<td>female</td>
<td>江蘇省蘇州市</td>
</tr>
<tr>
<th>3</th>
<td>sun quan</td>
<td>34.0</td>
<td>Female</td>
<td>福建省泉州市</td>
</tr>
</tbody>
</table>

</div>

正則表達(dá)式使用

# 例子5:正則表達(dá)式使用

df["address"].str.contains("^廣")
0     True
1    False
2    False
3    False
4     True
Name: address, dtype: bool

其中^表示開(kāi)始的符號(hào)亥曹,即:以開(kāi)頭的數(shù)據(jù)

df[df["address"].str.contains("^廣")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>4</th>
<td>guan yu</td>
<td>39.0</td>
<td>male</td>
<td>廣東省廣州市</td>
</tr>
</tbody>
</table>

</div>

正則表達(dá)式中的$表示結(jié)尾的符號(hào);下面是篩選以結(jié)尾的數(shù)據(jù):

df[df["address"].str.contains("市$")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>1</th>
<td>Xiao zhang</td>
<td>19.0</td>
<td>Female</td>
<td>浙江省杭州市</td>
</tr>
<tr>
<th>2</th>
<td>NaN</td>
<td>20.0</td>
<td>female</td>
<td>江蘇省蘇州市</td>
</tr>
<tr>
<th>3</th>
<td>sun quan</td>
<td>34.0</td>
<td>Female</td>
<td>福建省泉州市</td>
</tr>
<tr>
<th>4</th>
<td>guan yu</td>
<td>39.0</td>
<td>male</td>
<td>廣東省廣州市</td>
</tr>
</tbody>
</table>

</div>

在下面的正則表達(dá)式例子中恨诱,會(huì)在深蘇泉中任意選擇一個(gè)媳瞪,然后包含這個(gè)字符的數(shù)據(jù):

df[df["address"].str.contains("[深蘇泉]")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>2</th>
<td>NaN</td>
<td>20.0</td>
<td>female</td>
<td>江蘇省蘇州市</td>
</tr>
<tr>
<th>3</th>
<td>sun quan</td>
<td>34.0</td>
<td>Female</td>
<td>福建省泉州市</td>
</tr>
</tbody>
</table>

</div>

startswith

startswith的語(yǔ)法相對(duì)簡(jiǎn)單:

Series.str.startswith(pat, na=None)
  • pat:表示一個(gè)字符;注意:不接受正則表達(dá)式
  • na:表示對(duì)缺失值的處理照宝;na=False表示忽略缺失值

pat參數(shù)

指定一個(gè)字符蛇受;不接受正則表達(dá)式

df["address"].str.startswith("廣")
0     True
1    False
2    False
3    False
4     True
Name: address, dtype: bool
df[df["address"].str.startswith("廣")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>4</th>
<td>guan yu</td>
<td>39.0</td>
<td>male</td>
<td>廣東省廣州市</td>
</tr>
</tbody>
</table>

</div>

這種寫(xiě)法和正則表達(dá)式的以某個(gè)字符開(kāi)頭是同樣的效果:

df[df["address"].str.contains("^廣")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>4</th>
<td>guan yu</td>
<td>39.0</td>
<td>male</td>
<td>廣東省廣州市</td>
</tr>
</tbody>
</table>

</div>

自動(dòng)區(qū)分大小寫(xiě)

startswith方法是自動(dòng)區(qū)分大小寫(xiě)的:

df[df["sex"].str.startswith("f")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>2</th>
<td>NaN</td>
<td>20.0</td>
<td>female</td>
<td>江蘇省蘇州市</td>
</tr>
</tbody>
</table>

</div>

df[df["sex"].str.startswith("F")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>1</th>
<td>Xiao zhang</td>
<td>19.0</td>
<td>Female</td>
<td>浙江省杭州市</td>
</tr>
<tr>
<th>3</th>
<td>sun quan</td>
<td>34.0</td>
<td>Female</td>
<td>福建省泉州市</td>
</tr>
</tbody>
</table>

</div>

缺失值處理

df["name"].str.startswith("xiao")
0     True
1    False
2      NaN
3    False
4    False
Name: name, dtype: object
df[df["name"].str.startswith("xiao",na=False)]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
</tbody>
</table>

</div>

endswith

指定以某個(gè)字符結(jié)尾,語(yǔ)法為:

Series.str.endswith(pat, na=None)
  • pat:表示一個(gè)字符厕鹃;注意:不接受正則表達(dá)式
  • na:表示對(duì)缺失值的處理兢仰;na=False表示忽略缺失值

pat參數(shù)

# 以市結(jié)尾

df[df["address"].str.endswith("市")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>1</th>
<td>Xiao zhang</td>
<td>19.0</td>
<td>Female</td>
<td>浙江省杭州市</td>
</tr>
<tr>
<th>2</th>
<td>NaN</td>
<td>20.0</td>
<td>female</td>
<td>江蘇省蘇州市</td>
</tr>
<tr>
<th>3</th>
<td>sun quan</td>
<td>34.0</td>
<td>Female</td>
<td>福建省泉州市</td>
</tr>
<tr>
<th>4</th>
<td>guan yu</td>
<td>39.0</td>
<td>male</td>
<td>廣東省廣州市</td>
</tr>
</tbody>
</table>

</div>

# 正則的寫(xiě)法:contains方法

df[df["address"].str.contains("市$")]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>1</th>
<td>Xiao zhang</td>
<td>19.0</td>
<td>Female</td>
<td>浙江省杭州市</td>
</tr>
<tr>
<th>2</th>
<td>NaN</td>
<td>20.0</td>
<td>female</td>
<td>江蘇省蘇州市</td>
</tr>
<tr>
<th>3</th>
<td>sun quan</td>
<td>34.0</td>
<td>Female</td>
<td>福建省泉州市</td>
</tr>
<tr>
<th>4</th>
<td>guan yu</td>
<td>39.0</td>
<td>male</td>
<td>廣東省廣州市</td>
</tr>
</tbody>
</table>

</div>

缺失值處理

df["name"].str.endswith("g")
0     True
1     True
2      NaN
3    False
4    False
Name: name, dtype: object
df[df["name"].str.endswith("g",na=False)]

<div>
<style scoped>
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}

.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}

</style>

<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>age</th>
<th>sex</th>
<th>address</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>xiao ming</td>
<td>22.0</td>
<td>male</td>
<td>廣東省深圳市</td>
</tr>
<tr>
<th>1</th>
<td>Xiao zhang</td>
<td>19.0</td>
<td>Female</td>
<td>浙江省杭州市</td>
</tr>
</tbody>
</table>

</div>

# 不加na參數(shù)則報(bào)錯(cuò)
df[df["name"].str.endswith("g")]
image

報(bào)錯(cuò)的原因很明顯:就是因?yàn)閚ame字段下面存在缺失值。當(dāng)使用了na參數(shù)就可以解決

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末剂碴,一起剝皮案震驚了整個(gè)濱河市把将,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忆矛,老刑警劉巖察蹲,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件请垛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡洽议,警方通過(guò)查閱死者的電腦和手機(jī)宗收,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)亚兄,“玉大人混稽,你說(shuō)我怎么就攤上這事∩笈撸” “怎么了匈勋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)菲盾。 經(jīng)常有香客問(wèn)我颓影,道長(zhǎng),這世上最難降的妖魔是什么懒鉴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮碎浇,結(jié)果婚禮上临谱,老公的妹妹穿的比我還像新娘。我一直安慰自己奴璃,他們只是感情好悉默,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著苟穆,像睡著了一般抄课。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雳旅,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天跟磨,我揣著相機(jī)與錄音,去河邊找鬼攒盈。 笑死抵拘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的型豁。 我是一名探鬼主播僵蛛,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迎变!你這毒婦竟也來(lái)了充尉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衣形,失蹤者是張志新(化名)和其女友劉穎驼侠,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泪电,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年般妙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片相速。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碟渺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突诬,到底是詐尸還是另有隱情苫拍,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布旺隙,位于F島的核電站绒极,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蔬捷。R本人自食惡果不足惜垄提,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望周拐。 院中可真熱鬧铡俐,春花似錦、人聲如沸妥粟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勾给。三九已至滩报,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間播急,已是汗流浹背脓钾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旅择,地道東北人惭笑。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像生真,于是被迫代替她去往敵國(guó)和親沉噩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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