簡體   English   中英

Python pandas 使用 fillna() 來避免對 NaN 值進行錯誤拆分

[英]Python pandas use fillna() to avoid error splitting on NaN value

my_df = pd.DataFrame(data = { 'col0': ['1%2%', '3%4%'], 'col1': [np.nan, np.nan], 'col2': ['+1-2', '+2-4'], 'col3': [np.nan, '+2-4'], 'col4': [np.nan, np.nan] })

my_df[['col0a', 'col0b']] = my_df['col0'].fillna('%').str.split('%', expand = True).iloc[:, 0:2]
my_df[['col1a', 'col1b']] = my_df['col1'].fillna('%').str.split('%', expand = True).iloc[:, 0:2]
my_df[['col2a', 'col2b']] = my_df['col2'].str.split('(?<=[\d]|K)(?=[+-])', expand=True)
my_df[['col3a', 'col3b']] = my_df['col3'].str.split('(?<=[\d]|K)(?=[+-])', expand=True)
my_df[['col4a', 'col4b']] = my_df['col4'].str.split('(?<=[\d]|K)(?=[+-])', expand=True)

my_df

這會在my_df[['col4a', 'col4b']]行引發錯誤,因為整列都是NaN值。 對於col1 ,因為我們用%填充,所以沒有拋出錯誤,然后拆分在%上拆分,導致兩列帶有空字符串,這正是我們想要的。

我們可以向col4添加什么fillna()以使其不會引發錯誤? col4 的拆分比 col1 的拆分更復雜(尋找 +#-# 的模式)。 我們已經嘗試過fillna('+-')但這不起作用。 一般來說,我們正在尋找一種解決方案,當col4的值為NaN時,它為col4acol4b輸出空字符串。

編輯:措辭不同,我需要一個用於 fillna 的字符串,當傳遞給.split('(?<=[\d]|K)(?=[+-])', expand=True)時,將導致 2空字符串,雖然也許我可以用類似fillna(+9999-9999)的東西替換,然后用空字符串替換 9999 ......

(可能)更好的解決方案是使用.str.extract而不是.str.split ,這更適合您的目的:

my_df = pd.DataFrame(data = { 'col0': ['1%2%', '3%4%'], 'col1': [np.nan, np.nan], 'col2': ['+1-2', '+2-4'], 'col3': [np.nan, '+2-4'], 'col4': [np.nan, np.nan] })
my_df = my_df.fillna('')

pat1 = r'(\d+%)(\d+%)'
pat2 = r'([+-](?:[\d]+|K))([+-](?:[\d]+|K))'

my_df[['col0a', 'col0b']] = my_df['col0'].str.extract(pat1)
my_df[['col1a', 'col1b']] = my_df['col1'].str.extract(pat1)
my_df[['col2a', 'col2b']] = my_df['col2'].str.extract(pat2)
my_df[['col3a', 'col3b']] = my_df['col3'].str.extract(pat2)
my_df[['col4a', 'col4b']] = my_df['col4'].str.extract(pat2)
my_df = my_df.fillna('')

Output:

>>> my_df
   col0 col1  col2  col3 col4 col0a col0b col1a col1b col2a col2b col3a col3b col4a col4b
0  1%2%       +1-2               1%    2%                +1    -2                        
1  3%4%       +2-4  +2-4         3%    4%                +2    -4    +2    -4

不完美,但這個 2 行解決方案比我使用的當前 8 行解決方案更好 if: else: 塊。

my_df[['col4a', 'col4b']] = my_df['col4'].fillna('+999999-999999').str.split('(?<=[\d]|K)(?=[+-])', expand=True)
my_df[['col4a', 'col4b']] = my_df[['col4a', 'col4b']].replace('+999999', '').replace('-999999', '')

暫無
暫無

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

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