解决Pandas中TypeError: NoneType与int相加报错及行重复需求问题
问题分析与解决方案
错误原因
- 文件读取错误:你用
pd.ExcelFile()得到的是文件对象,而非可直接操作的DataFrame,后续通过time.index或time['Pending']访问数据时会出现异常,导致取值返回NoneType,触发+运算的类型错误。 - 变量未初始化+逻辑混乱:代码中
df未提前创建就直接赋值;同时用列表存储索引的方式极易引发类型混淆,循环逻辑完全不符合行重复的需求。
正确实现方法
Pandas内置了高效的行重复实现方式,完全不需要复杂循环,以下两种方案可靠且高效:
方案一:利用np.repeat生成重复索引
import pandas as pd # 正确读取Excel为DataFrame df = pd.read_excel('Block_time_JP1.xlsx') # 根据Pending列的值重复对应行 result = df.loc[df.index.repeat(df['Pending'])] # 重置索引(可选,让索引连续) result = result.reset_index(drop=True) # 查看结果前几行 print(result.head())
方案二:利用explode方法(逻辑更直观)
import pandas as pd df = pd.read_excel('Block_time_JP1.xlsx') # 给每行生成对应次数的列表,再展开成多行 df['temp'] = df['Pending'].apply(lambda x: [x]*x) result = df.explode('temp').drop('temp', axis=1) result = result.reset_index(drop=True) print(result.head())
原代码的错误修正(不推荐,循环效率极低)
如果一定要用循环实现,需先修正基础问题:
import pandas as pd # 正确读取数据为DataFrame time_df = pd.read_excel('Block_time_JP1.xlsx') # 初始化空的结果DataFrame result_df = pd.DataFrame(columns=time_df.columns) current_idx = 0 for _, row in time_df.iterrows(): repeat_num = row['Pending'] # 重复当前行指定次数并添加到结果 for _ in range(repeat_num): result_df.loc[current_idx] = row current_idx += 1 result_df = result_df.reset_index(drop=True) print(result_df.head())
注意:循环方法仅适合极小数据集,大数据量下强烈推荐前两种内置方法,效率差距可达数倍甚至数十倍。
内容的提问来源于stack exchange,提问作者Shepherd
相关产品推荐
相关产品推荐

