如何选取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
相关产品推荐
相关产品推荐

