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

如何选取DataFrame单行且保留原列数据类型?

如何在逐行处理DataFrame时保留原列数据类型?

你遇到的问题根源在于:用iloc[i]提取单行时得到的是Series对象,而Series只能存储单一数据类型,pandas会自动将所有列类型提升为兼容的float64,导致原类型丢失。要避免这种情况,可采用以下几种方案:

方法1:提取单行时返回DataFrame而非Series

使用iloc[[i]](双层方括号)提取单行,得到的是仅含一行的DataFrame,能完全保留原列的数据类型:

print('Chunk dtypes:')
print(chunk.dtypes)

# 提前用原DataFrame的列类型初始化空的新DataFrame
new_df = pd.DataFrame(columns=chunk.columns, dtype=chunk.dtypes.to_dict())

for i in range(len(chunk)):
    # 提取单行DataFrame
    row_df = chunk.iloc[[i]]
    
    print('row_df dtypes:')
    print(row_df.dtypes)
    
    # 执行复杂逻辑添加新列
    row_df['new_column'] = your_complex_logic(row_df)
    
    # 追加到新DataFrame
    new_df = pd.concat([new_df, row_df], ignore_index=True)

方法2:将Series转换为单行DataFrame

若习惯用iloc[i]获取Series,可通过to_frame().T将其转换为单行DataFrame,再恢复原类型:

# 初始化新DataFrame
new_df = pd.DataFrame(columns=chunk.columns, dtype=chunk.dtypes.to_dict())

for i in range(len(chunk)):
    row_series = chunk.iloc[i]
    # 转换为单行DataFrame
    row_df = row_series.to_frame().T
    # 强制恢复原列类型
    row_df = row_df.astype(chunk.dtypes.to_dict())
    
    # 添加新列
    row_df['new_column'] = your_complex_logic(row_df)
    
    # 追加到新DataFrame
    new_df = pd.concat([new_df, row_df], ignore_index=True)

方法3:提前锁定新DataFrame的列类型

无论用哪种方式提取单行,初始化新DataFrame时明确指定各列的类型,能确保追加时不会自动转换类型:

# 直接复用原DataFrame的列类型
new_df = pd.DataFrame(columns=chunk.columns, dtype=chunk.dtypes.to_dict())

效果验证

用方法1提取的row_df数据类型会与原chunk完全一致:

row_df dtypes:
dt             int64
lat          float32
lon          float32
isfc           uint8
isst          uint16
itpw           uint8
iali           uint8
dtype: object

这样处理后,追加到新DataFrame的每行都会保留原数据类型,无需事后重新设置,对日期类列(如你的dt列)也能完美兼容。

内容的提问来源于stack exchange,提问作者Grant Petty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:15:17