[英]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.