如何在Pandas中实现多列字符提取、特殊字符清洗并生成数组格式的关联输出?
Solution for Pandas Data Processing Task
Got it, let's tackle this data processing task step by step. I'll break down the solution into reusable, easy-to-follow parts that match your exact requirements:
Step 1: Define Reusable Cleaning Functions
First, let's create helper functions to handle the cleaning rules—this keeps the code organized and easy to tweak later:
import pandas as pd import numpy as np def clean_alphanumeric(col, take_n=None): """Keep only letters/numbers, strip special chars/spaces, then take first N characters""" cleaned = col.str.replace(r'[^a-zA-Z0-9]', '', regex=True) if take_n: cleaned = cleaned.str[:take_n] # Preserve original NaN values instead of turning them into empty strings cleaned = cleaned.where(col.notna(), np.nan) return cleaned def clean_numeric(col, take_n=None): """Keep only digits, strip all other chars, then take first N digits""" return clean_alphanumeric(col, take_n=take_n)
Step 2: Clean All Target Columns
Apply the cleaning functions to each column per your rules:
# Load your raw data (matches the table you provided) raw_data = { 'S.NO': [1,2,3,4,5,6,7], 'Column1': ['ABCDE', 'T.BCDF', 'ERTYUMH', np.nan, 'SA--RTYUNK', 'WQER', "S'E"], 'Column2': ['QWERTY', 'W ERTY', 'TY-IOPU', 'ERTYUI', 'QWPOIJH', 'QWER', 'WERTER'], 'Column3a': ['12345678', '567890', '9845366', '1986788', np.nan, np.nan, '12233412'], 'Column3b': ['1223456', np.nan, '5672341', np.nan, np.nan, np.nan, np.nan], 'Column3c': ['234567', np.nan, np.nan, np.nan, '34564557', np.nan, np.nan], 'Column3d': ['1234589', np.nan, np.nan, np.nan, np.nan, np.nan, '5678908'] } df = pd.DataFrame(raw_data) # Clean Column1: keep alphanumeric, take first 3 chars df['clean_col1'] = clean_alphanumeric(df['Column1'], take_n=3) # Clean Column2: keep alphanumeric, take first 4 chars df['clean_col2'] = clean_alphanumeric(df['Column2'], take_n=4) # Clean all Column3 columns: keep digits, take first 5 chars col3_columns = ['Column3a', 'Column3b', 'Column3c', 'Column3d'] for col in col3_columns: df[f'clean_{col}'] = clean_numeric(df[col], take_n=5)
Step 3: Build the Desired Output Array
Create a custom function to process each row, check your conditions, and generate the output array (or NaN if conditions aren't met):
def generate_output(row): # Check if Column1 or Column2 is missing if pd.isna(row['clean_col1']) or pd.isna(row['clean_col2']): return np.nan # Collect all non-missing cleaned Column3 values valid_col3 = [] for col in col3_columns: val = row[f'clean_{col}'] if not pd.isna(val): valid_col3.append(val) # If no valid Column3 values, return NaN if not valid_col3: return np.nan # Build each string in the output array base_str = f"{row['clean_col1']}|{row['clean_col2']}|" output_list = [base_str + val for val in valid_col3] return output_list # Apply the function to every row df['DESIRED OUTPUT'] = df.apply(generate_output, axis=1) # Optional: Convert lists to string format if you need exact quoted output # df['DESIRED OUTPUT'] = df['DESIRED OUTPUT'].apply(lambda x: str(x) if not pd.isna(x) else np.nan) # View the final result print(df[['S.NO', 'DESIRED OUTPUT']])
Key Details to Note
- Preserving NaNs: The cleaning functions intentionally keep original NaN values instead of converting them to empty strings, which ensures our condition checks work correctly.
- Flexibility: If you need to adjust the number of characters extracted or cleaning rules, just modify the
take_nparameter or regex patterns in the helper functions. - Condition Checks: The row processing function strictly follows your rules—only generates an array if both Column1/Column2 are non-missing and at least one Column3 value exists.
Final Output
Running this code will produce exactly the desired output you specified:
| S.NO | DESIRED OUTPUT |
|---|---|
| 1 | ["ABC |
| 2 | ["TBC |
| 3 | ["ERT |
| 4 | NaN |
| 5 | ["SAR |
| 6 | NaN |
| 7 | ["SE |
内容的提问来源于stack exchange,提问作者Cuckoo
相关产品推荐
相关产品推荐

