簡體   English   中英

在 DataFrame 中拆分字符串並僅保留某些部分

[英]Split strings in DataFrame and keep only certain parts

我有一個像這樣的 DataFrame:

x = ['3.13.1.7-2.1', '3.21.1.8-2.2', '4.20.1.6-2.1', '4.8.1.2-2.0', '5.23.1.10-2.2']
df = pd.DataFrame(data = x, columns = ['id'])

    id
0   3.13.1.7-2.1
1   3.21.1.8-2.2
2   4.20.1.6-2.1
3   4.8.1.2-2.0
4   5.23.1.10-2.2

我需要在句點上拆分每個 id 字符串,然后我需要知道第二部分何時為 13,第三部分何時為 1。理想情況下,我會有一個額外的列是 boolean 值(在上面的示例中,索引0 為 TRUE,其他所有為 FALSE)。 但是我可以使用多個附加列,其中一個或多個包含單獨的字符串部分,一個用於所述 boolean 值。

我首先嘗試將字符串分成幾部分:

df['id_split'] = df['id'].apply(lambda x: str(x).split('.'))

這有效,但是如果我嘗試像這樣僅隔離字符串的第二部分......

df['id_split'] = df['id'].apply(lambda x: str(x).split('.')[1])

...我收到列表索引超出范圍的錯誤。

但是,如果我像這樣檢查 DataFrame 中的任何單個索引...

df['id_split'][0][1]

...這行得通,只產生字符串列表中的第二項。

我想我對 .apply() 方法的作用還不夠熟悉,不知道為什么它不接受列表索引。 但無論如何,我想知道如何以可擴展的方式(實際數據集為數百萬行)基於這些值隔離每個字符串的第二和第三部分,檢查它們的值,以及 output 和 boolean。 謝謝!

讓我們使用str.split來獲取零件,然后您可以比較:

parts = df['id'].str.split('\.', expand=True)

(parts[[1,2]] == ['13','1']).all(1)

Output:

0     True
1    False
2    False
3    False
4    False
dtype: bool

你可以做這樣的事情

df['flag'] = df['id'].apply(lambda x: True if x.split('.')[1] == '13' and x.split('.')[2]=='1' else False)

Output

            id   flag
0   3.13.1.7-2.1   True
1   3.21.1.8-2.2  False
2   4.20.1.6-2.1  False
3    4.8.1.2-2.0  False
4  5.23.1.10-2.2  False

您可以直接執行此操作,如下所示:

df['new'] = df['id'].apply(lambda x: str(x).split('.')[1]=='13' and str(x).split('.')[2]=='1')

>>> print(df)
              id    new
0   3.13.1.7-2.1   True
1   3.21.1.8-2.2  False
2   4.20.1.6-2.1  False
3    4.8.1.2-2.0  False
4  5.23.1.10-2.2  False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM