我有 20 多列的 Excel 工作表,如果我想选择不包含文本 n/a 的行,是否可以将 n/a 作为文本传递并找到它?
我尝试过的代码是,''''将 pandas 导入为 pd 进口重新 导入操作系统
def extract_data(input_file): # 读取输入的Excel文件 df = pd.read_excel(input_file)
# Check if 'agreed' is present in column 5
if not df.iloc[:, 4].astype(str).str.contains('Agreed', case=False, na=False).any():
print("No 'agreed' found in column 5")
return
# Filter rows where column 5 contains 'agreed'
filtered_df = df[df.iloc[:, 4].astype(str).str.contains('Agreed', case=False, na=False)]
# Initialize DataFrames for the four sheets
volumen_df = pd.DataFrame()
mrr_premium_df = pd.DataFrame()
lrr_df = pd.DataFrame()
meb_df = pd.DataFrame()
# Define a function to extract values from text
def extract_values(text, pattern):
match = re.search(pattern, text, re.IGNORECASE)
return match.group(1) if match else None
# Function to check if exclusion texts are in the specified column
def contains_exclusion_texts(value):
exclusion_texts = ["n/a", "entfallen", "tbd"]
return any(excluded_text in str(value).lower() for excluded_text in exclusion_texts)
# Process each row individually
for index, row in filtered_df.iterrows():
col13 = contains_exclusion_texts(row.iloc[13])
col14 = contains_exclusion_texts(row.iloc[14])
col15 = contains_exclusion_texts(row.iloc[15])
pdu_short_name = str(row.iloc[11]).replace('FAULT_', '')
cycle_time = extract_values(str(row.iloc[20]), r'(\d+\s*ms)')
n_value = extract_values(str(row.iloc[20]), r'n\s*=\s*(\d+)')
q_value = extract_values(str(row.iloc[20]), r'q\s*=\s*(\d+)')
max_delta_counter = extract_values(str(row.iloc[20]), r'MaxDeltaCounterInit\s*=\s*(\d+)')
no_new_or_repeated_data = extract_values(str(row.iloc[20]), r'NoNewOrRepeatedData\s*=\s*(\d+)')
data = {
'PDU short name': pdu_short_name,
'Cycle time': cycle_time,
'n': n_value,
'q': q_value,
'Max Delta Counter': max_delta_counter,
'No New Or Repeated Data': no_new_or_repeated_data
}
if not col13:
# Volumen
volumen_df = volumen_df.append(data, ignore_index=True)
if not col14 :
# Check column 12 for LRR or MRR_Premium
type_col_value = str(row.iloc[12])
if 'LRR' in type_col_value:
lrr_df = lrr_df.append(data, ignore_index=True)
if 'MRR_Premium' in type_col_value:
mrr_premium_df = mrr_premium_df.append(data, ignore_index=True)
if not col15 :
# Meb
meb_df = meb_df.append(data, ignore_index=True)
# Define output file path
output_file = os.path.join(os.path.dirname(input_file), 'extracted_data3.xlsx')
# Save the extracted data to a new Excel file with different sheets
with pd.ExcelWriter(output_file) as writer:
volumen_df.to_excel(writer, sheet_name='Volumen', index=False)
mrr_premium_df.to_excel(writer, sheet_name='MRR Premium', index=False)
lrr_df.to_excel(writer, sheet_name='LRR', index=False)
meb_df.to_excel(writer, sheet_name='Meb', index=False)
print(f"Data extracted and saved to {output_file}")
从用户处获取输入文件路径
input_file_path = input("输入输入Excel文件的路径:")
使用用户提供的文件调用该函数路径
extract_data(input_file_path) '''' 在此代码中,我试图查找所需列中是否存在 n/a 或 entfallen 或 tbd,但我仅获得 entfallen 和 tbd 的输出,而不是 n/a 的输出。意味着代码未检测到任何列中的 n/a。也许是什么原因?由于 n/a 中存在正斜杠,我是否应该找到替代方法来读取 n/a 而不是字符串。
你的代码似乎处理“n/a”字符串的方式存在问题。虽然你在
contains_exclusion_texts
函数中包含了它,但在正则表达式中用作文字字符时,正斜杠 (
/
) 在正则表达式中具有特殊含义。
你可以使用以下方法修改代码来解决这个问题:
-
使用
re.escape
转义正斜杠:
将
contains_exclusion_texts
函数修改为以下内容:
python
def contains_exclusion_texts(value):
exclusion_texts = [re.escape("n/a"), "entfallen", "tbd"]
return any(re.search(excluded_text, str(value), re.IGNORECASE) for excluded_text in exclusion_texts)
这将确保在进行比较之前将“n/a”中的正斜杠正确转义为文字字符。
- 在不使用正则表达式的情况下检查存在情况:
由于你只是在检查是否存在字符串,因此你可以完全避免使用正则表达式,而使用以下方法:
python
def contains_exclusion_texts(value):
exclusion_texts = ["n/a", "entfallen", "tbd"]
return any(excluded_text.lower() in str(value).lower() for excluded_text in exclusion_texts)
此方法将每个排除文本转换为小写,并在进行比较之前将值转换为小写,从而确保一致的比较。
通过这些更改,你的代码现在应该能够在指定列中正确检测“n/a”,并相应地过滤行。
标签:python,pandas,dataframe,spyder,xlsx From: 78851487