You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas结合CPI库时如何保留重复数据?

问题解决:通胀调整时丢失重复银行数据

原始数据集示例

Bank NameYearClosing DateAssetDepositCityState
Signature Bank202312-Mar-2311040088600New YorkNY
Signature Bank20118-Jul-1166.764.5WindsorCO

运行后丢失数据的结果

Bank NameYearClosing DateAssetDepositCityStateInflation-Adj
Signature Bank1/1/20118-Jul-116664WindsorCO85.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:42:51