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('+-'),但这是行不通的。通常,当col4a和col4b的值为NaN时,我们正在寻找一个输出空字符串的解决方案。
编辑:的措辞不同,我需要一个用于填充can的字符串,当它传递给.split('(?<=[\d]|K)(?=[+-])', expand=True)时,会产生两个空字符串,尽管我也许可以用类似于fillna(+9999-9999)的东西替换,然后用空字符串替换9999 .
发布于 2021-12-22 18:30:37
一个(可能)更好的解决方案是使用.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('')输出:
>>> 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发布于 2021-12-22 18:23:39
不是很完美,但是这个2行解决方案比我现在的8行解决方案要好,该解决方案使用if: else: block。
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', '')https://stackoverflow.com/questions/70453409
复制相似问题