[英]how to use pandas fillna NaN with the negative of the next row value
[英]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
時,它為col4a
和col4b
輸出空字符串。
編輯:措辭不同,我需要一個用於 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.