检查列是否包含 (/,-,_, *or~) 并在另一列中拆分 - Pandas
Check if column contains (/,-,_, *or~) and split in another column - Pandas
我有一列包含数字和其中一个字符 -,/,*,~,_。我需要检查值是否包含任何字符,然后将值拆分到另一列中。是否有与下图不同的解决方案?最后,列 subnumber1、subnumber2 ...subnumber5 将合并为一列,列“number5”将没有字符。我需要在进一步的过程中使用这两列。我是 Python 的新手,欢迎提出任何建议。
if gdf['column_name'].str.contains('~').any():
gdf[['number1', 'subnumber1']] = gdf['column_name'].str.split('~', expand=True)
gdf
if gdf['column_name'].str.contains('^').any():
gdf[['number2', 'subnumber2']] = gdf['column_name'].str.split('^', expand=True)
gdf
Input column:
column_name
152/6*3
163/1-6
145/1
163/6^3
output:
number5 |subnumber1 |subnumber2
152 | 6 | 3
163 | 1 | 6
145 | 1 |
163 | 6 | 3
使用 Series.str.split
和可能的分隔符列表并创建新的 DataFrame:
import re
L = ['-','/','*','~','_','^', '.']
#some values like `^.` are escape
pat = '|'.join(re.escape(x) for x in L)
df = df['column_name'].str.split(pat, expand=True).add_prefix('num')
print (df)
num0 num1 num2
0 152 6 3
1 163 1 6
2 145 1 None
3 163 6 3
编辑:如果在值使用前需要匹配值:
L = ["\-_",'\^|\*','~','/']
for val in L:
df[f'before {val}'] = df['column_name'].str.extract(rf'(\d+){[val]}')
#for last value not exist separator, so match $ for end of string
df['last'] = df['column_name'].str.extract(rf'(\d+)$')
print (df)
column_name before \-_ before \^|\* before ~ before / last
0 152/2~3_4*5 3 4 2 152 5
1 152/2~3-4^5 4 4 2 152 5
2 152/6*3 NaN 6 NaN 152 3
3 163/1-6 NaN NaN NaN 163 6
4 145/1 NaN NaN NaN 145 1
5 163/6^3 6 6 NaN 163 3
使用str.split
:
df['column_name'].str.split(r'[*,-/^_]', expand=True)
输出:
0 1 2
0 152 6 3
1 163 1 6
2 145 1 None
3 163 6 3
或者,如果您事先知道您有 3 个号码,请使用 str.extract
和命名捕获组:
regex = '(?P<number5>\d+)\D*(?P<subnumber1>\d*)\D*(?P<subnumber2>\d*)'
df['column_name'].str.extract(regex)
输出:
number5 subnumber1 subnumber2
0 152 6 3
1 163 1 6
2 145 1
3 163 6 3
我有一列包含数字和其中一个字符 -,/,*,~,_。我需要检查值是否包含任何字符,然后将值拆分到另一列中。是否有与下图不同的解决方案?最后,列 subnumber1、subnumber2 ...subnumber5 将合并为一列,列“number5”将没有字符。我需要在进一步的过程中使用这两列。我是 Python 的新手,欢迎提出任何建议。
if gdf['column_name'].str.contains('~').any():
gdf[['number1', 'subnumber1']] = gdf['column_name'].str.split('~', expand=True)
gdf
if gdf['column_name'].str.contains('^').any():
gdf[['number2', 'subnumber2']] = gdf['column_name'].str.split('^', expand=True)
gdf
Input column:
column_name
152/6*3
163/1-6
145/1
163/6^3
output:
number5 |subnumber1 |subnumber2
152 | 6 | 3
163 | 1 | 6
145 | 1 |
163 | 6 | 3
使用 Series.str.split
和可能的分隔符列表并创建新的 DataFrame:
import re
L = ['-','/','*','~','_','^', '.']
#some values like `^.` are escape
pat = '|'.join(re.escape(x) for x in L)
df = df['column_name'].str.split(pat, expand=True).add_prefix('num')
print (df)
num0 num1 num2
0 152 6 3
1 163 1 6
2 145 1 None
3 163 6 3
编辑:如果在值使用前需要匹配值:
L = ["\-_",'\^|\*','~','/']
for val in L:
df[f'before {val}'] = df['column_name'].str.extract(rf'(\d+){[val]}')
#for last value not exist separator, so match $ for end of string
df['last'] = df['column_name'].str.extract(rf'(\d+)$')
print (df)
column_name before \-_ before \^|\* before ~ before / last
0 152/2~3_4*5 3 4 2 152 5
1 152/2~3-4^5 4 4 2 152 5
2 152/6*3 NaN 6 NaN 152 3
3 163/1-6 NaN NaN NaN 163 6
4 145/1 NaN NaN NaN 145 1
5 163/6^3 6 6 NaN 163 3
使用str.split
:
df['column_name'].str.split(r'[*,-/^_]', expand=True)
输出:
0 1 2
0 152 6 3
1 163 1 6
2 145 1 None
3 163 6 3
或者,如果您事先知道您有 3 个号码,请使用 str.extract
和命名捕获组:
regex = '(?P<number5>\d+)\D*(?P<subnumber1>\d*)\D*(?P<subnumber2>\d*)'
df['column_name'].str.extract(regex)
输出:
number5 subnumber1 subnumber2
0 152 6 3
1 163 1 6
2 145 1
3 163 6 3