簡體   English   中英

python pandas替換以字符串模式為條件的列值,並使用split()

[英]python pandas replacing column values conditional on string patterns and using split()

潛伏了很長時間-我終於堅持了一個涉及熊貓的項目,比以往任何時候都需要您的幫助。

我有一個像下面的數據框。 每行描述一個退休公式,該公式可能具有多個條件(因此為e1)

index    e0     e1 
1    62/10   NaN
2    age 55  NaN
3    67/10   age 70

我要創建一個描述最小年齡的列年齡。 我已經定義了如何描述每個標准的模式。 例如,

 pattern1=r'.*/.*'

 pattern7=r'age.[0-9].*'

我有pattern1-pattern7。

我使用以下代碼將e0的年齡部分提取到新的列年齡:

 df['age']=df['e0'][(df['e0'].str.match(pattern1)==1)].apply(lambda x: str(x).split('/')[0])

這給了我

index    e0     e1    age
1    62/10   NaN      62
2    age 55  NaN      NaN
3    67/10   age 70   67

我想處理其他格式,例如“ 55歲”(在這種情況下,提取55),但是我不確定該怎么做。 如果我做

  df['age']=df['e0'][(df['e0'].str.match(pattern7)==1)].apply(lambda x: str(x).split(' ')[1])

那顯然是錯誤的,因為我會覆蓋已經存在的年齡,

index    e0     e1    age
1    62/10   NaN      NaN
2    age 55  NaN      55
3    67/10   age 70   NaN

我已經嘗試了語法允許的其他變體,但無濟於事。 我是Stata用戶,在Stata中,我將在regexm上使用條件的replace命令。 我正在嘗試學習Python,這是一段艱難的旅程! 我對此表示感謝。

此外,我還有另一個(希望如此)快速問題:我使用以下兩行代碼來消除e0和e1中的空白。

 option['e0']=option['e0'].str.strip()
 option['e1']=option['e1'].str.strip()

有沒有一種方法可以同時解決這兩個問題?

非常感謝。

有趣的問題,在這里我傳遞了一個刪除NaN值的函數,然后調用sum來連接數據行。

然后,我們可以使用正則表達式\\d+調用向量化的str方法findall ,它將所有數字作為列表返回。

然后,我們對此應用另一個函數,該函數將str數字轉換為int並將它們放在列表中並返回最小值:

In [37]:

def func(x):
    return x.dropna().sum()
​
def lowest(x):
    return min(list(map(int,x)))
​
df['min'] = df[['e0','e1']].apply(lambda x: func(x), axis=1).str.findall(r'\d+').apply(lowest)
df
Out[37]:
   index      e0      e1  min
0      1   62/10     NaN   10
1      2  age 55     NaN   55
2      3   67/10  age 70   10

分解上面的內容,以便您可以看到發生了什么:

In [38]:

df[['e0','e1']].apply(lambda x: func(x), axis=1)
Out[38]:
0          62/10
1         age 55
2    67/10age 70
dtype: object
In [39]:

df[['e0','e1']].apply(lambda x: func(x), axis=1).str.findall(r'\d+')
Out[39]:
0        [62, 10]
1            [55]
2    [67, 10, 70]
dtype: object

這是對第二個問題的答復(每個帖子您應該堅持一個問題)。

df.loc[:, ['e0', 'e1']].apply(lambda x: x.str.strip())

我不確定為什么您以前將DataFrame稱為“ df”時將其稱為“選項”,所以我堅持使用后者。

暫無
暫無

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

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