求助:使用Pandas读取两个文件并整合捐赠数据至单个Excel
解决方案:合并用户列表与捐赠数据
需求回顾
需要将全量用户名列表与捐赠记录整合,生成包含所有用户名及对应捐赠额(无记录则填0或空)的单一Excel文件。
修改后的完整代码
from bs4 import BeautifulSoup import pandas as pd names= "member_info.txt" donations= "donations.txt" user_names = [] donation_user_names = [] user_amounts = [] # 读取并解析全量用户名文件 with open(names, 'r') as file: html_content_names = file.read() name_soup = BeautifulSoup(html_content_names, 'html.parser') name_rows = name_soup.find_all('div', class_='rank_row') for name_row in name_rows: user_name = name_row.find('span', class_='username').text user_names.append(user_name) # 读取并解析捐赠记录文件 with open(donations, 'r') as file: html_content_donations = file.read() donation_soup = BeautifulSoup(html_content_donations, 'html.parser') donation_name_rows = donation_soup.find_all('div', class_='rank_row') for donation_name_row in donation_name_rows: donation_user_name = donation_name_row.find('span', class_='username').text user_amount = donation_name_row.find('div', class_='amount plus')['data-sort'] donation_user_names.append(donation_user_name) user_amounts.append(user_amount) # 构建全量用户DataFrame df_users = pd.DataFrame({'Username': user_names}) # 构建捐赠记录DataFrame并处理金额格式 df_donations = pd.DataFrame({'Username': donation_user_names, 'Amount in M': user_amounts}) df_donations['Amount in M'] = df_donations['Amount in M'].astype(float).apply(lambda x: round(x/1000000, 1)) # 关键:左连接合并两个DataFrame,保留所有用户名 merged_df = df_users.merge(df_donations, on='Username', how='left') # 将无捐赠记录的用户金额填充为0(若需要空值可改为:merged_df['Amount in M'] = merged_df['Amount in M'].fillna('')) merged_df['Amount in M'] = merged_df['Amount in M'].fillna(0) # 按用户名排序(不区分大小写) merged_df = merged_df.sort_values(by='Username', ascending=True, key=lambda col: col.str.lower()) # 导出到单一Excel文件 output_excel = "combined_donations.xlsx" merged_df.to_excel(output_excel, index=False) print(f"合并数据已写入 {output_excel}")
核心步骤说明
- 数据合并:使用
merge方法的how='left'参数,以全量用户列表为基准,保留所有用户名并匹配对应捐赠记录,确保不会丢失任何用户信息。 - 缺失值处理:用
fillna(0)将无捐赠记录的用户金额设为0,若需要空值展示,替换为fillna('')即可。 - 统一排序:合并完成后再统一对用户名排序,避免分开排序导致的数据错位问题。
内容的提问来源于stack exchange,提问作者RobbertK
相关产品推荐
相关产品推荐

