首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python大熊猫使用fillna()来避免在NaN值上发生错误分裂

Python大熊猫使用fillna()来避免在NaN值上发生错误分裂
EN

Stack Overflow用户
提问于 2021-12-22 18:10:42
回答 2查看 214关注 0票数 0
代码语言:javascript
复制
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,没有抛出错误,因为我们用%填充no,然后在%上拆分,生成两列空字符串,这正是我们想要的。

我们可以将什么fillna()添加到col4中,使其不会抛出错误?col4的拆分比col1的拆分更复杂(寻找+#-#的模式)。我们已经尝试过fillna('+-'),但这是行不通的。通常,当col4acol4b的值为NaN时,我们正在寻找一个输出空字符串的解决方案。

编辑:的措辞不同,我需要一个用于填充can的字符串,当它传递给.split('(?<=[\d]|K)(?=[+-])', expand=True)时,会产生两个空字符串,尽管我也许可以用类似于fillna(+9999-9999)的东西替换,然后用空字符串替换9999 .

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-22 18:30:37

一个(可能)更好的解决方案是使用.str.extract而不是.str.split,后者更适合您的目的:

代码语言:javascript
复制
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('')

输出:

代码语言:javascript
复制
>>> 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
票数 1
EN

Stack Overflow用户

发布于 2021-12-22 18:23:39

不是很完美,但是这个2行解决方案比我现在的8行解决方案要好,该解决方案使用if: else: block。

代码语言:javascript
复制
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', '')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70453409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档