使用Pandas结合CPI库时如何保留重复数据?
问题解决:通胀调整时丢失重复银行数据
原始数据集示例
| Bank Name | Year | Closing Date | Asset | Deposit | City | State |
|---|---|---|---|---|---|---|
| Signature Bank | 2023 | 12-Mar-23 | 110400 | 88600 | New York | NY |
| Signature Bank | 2011 | 8-Jul-11 | 66.7 | 64.5 | Windsor | CO |
运行后丢失数据的结果
| Bank Name | Year | Closing Date | Asset | Deposit | City | State | Inflation-Adj |
|---|---|---|---|---|---|---|---|
| Signature Bank | 1/1/2011 | 8-Jul-11 | 66 | 64 | Windsor | CO | 85.86874664 |
问题代码
import pandas as pd import cpi # Read the CSV file df = pd.read_csv('merged_file.csv') # Mark all duplicates as True and keep them based on Asset, Deposit, State, and Acquiring Institution duplicates = df.duplicated(subset=['Bank Name'], keep=False) # Convert the 'Closing Date' column to datetime df['Year'] = pd.to_datetime(df['Year'], format='%Y') # Filter out any rows with dates after 2022-01-01 df = df[df['Year'] < pd.to_datetime('2023-01-01')] # Convert the 'Asset' and 'Deposit' columns to integers df['Asset'] = df['Asset'].astype(int) df['Deposit'] = df['Deposit'].astype(int) # Create new columns for inflation-adjusted 'Asset' and 'Deposit' values df['Inflation-Adjusted Asset'] = df.apply(lambda x: cpi.inflate(int(x['Asset']), int(x['Year'].year)), axis=1) df['Inflation-Adjusted Deposit'] = df.apply(lambda x: cpi.inflate(int(x['Deposit']), int(x['Year'].year)), axis=1) # Write the updated DataFrame to a new CSV file df.to_csv('inflation_adjusted.csv', index=False)
问题分析与解决方法
核心问题
- 日期过滤错误:代码中
df = df[df['Year'] < pd.to_datetime('2023-01-01')]会把Year=2023的行直接过滤掉——转成datetime后2023年对应2023-01-01,不满足“小于2023-01-01”的条件,这是丢失数据的主要原因。 - 重复标记未生效:代码里定义了
duplicates变量但没有实际使用,这行代码对数据没有任何影响。 - 数值强制转int损失精度:把带小数的
Asset和Deposit转成int会丢失小数部分,导致数据精度下降。
修改后的代码
import pandas as pd import cpi # 读取CSV文件 df = pd.read_csv('merged_file.csv') # 转换Year列为datetime格式 df['Year'] = pd.to_datetime(df['Year'], format='%Y') # 调整过滤条件:如果需要保留2023年数据,改为<=2023-01-01,或者直接移除这行过滤代码 # 示例:保留所有年份数据,移除过滤行;如果只需要到2023年,用<= # df = df[df['Year'] <= pd.to_datetime('2023-01-01')] # 转换Asset和Deposit为float类型(保留小数精度) df['Asset'] = df['Asset'].astype(float) df['Deposit'] = df['Deposit'].astype(float) # 生成通胀调整列 df['Inflation-Adjusted Asset'] = df.apply(lambda x: cpi.inflate(x['Asset'], x['Year'].year), axis=1) df['Inflation-Adjusted Deposit'] = df.apply(lambda x: cpi.inflate(x['Deposit'], x['Year'].year), axis=1) # 保存结果 df.to_csv('inflation_adjusted.csv', index=False)
关键修改点
- 移除了无效的重复标记代码:你的场景中两行数据的Year、State都不同,不属于重复数据,不需要额外去重;如果后续需要基于多列判断重复并保留,可以使用
df = df[~df.duplicated(subset=['Bank Name', 'Year', 'State'], keep='first')](根据实际需求调整subset和keep参数)。 - 修正了日期过滤逻辑:如果需要保留2023年数据,要么把条件改为
<=,要么直接删除过滤行。 - 将数值类型从int改为float,避免小数精度丢失。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

