无需逐个指定列值创建同结构Pandas DataFrame行的方法
问题描述
我在论坛上找到的相关帖子都是关于SQL INSERT语句的,找不到Python DataFrames相关的解决办法。
背景:我有一个列数极多的DataFrame,多到逐个指定或复制列名完全不现实。我想创建一个和原DataFrame列结构(列名、列数)完全一致的新DataFrame,只填充其中少量字段,其余字段用默认值(比如0、'No data')填充。
示例
原DataFrame结构:
|Field1|Field2|Field3|...|Field101|Field102|Field103| |DATA1-|------|Data3-|---|--------|Data102-|--------| |DATA1-|Data2-|Data3-|---|--------|Data102-|Data103-| |------|Data2-|------|---|Data101-|--------|--------| ... and many more rows
拟输入的数据(也可以用其他Python结构):
{'Field4': 'Hello', 'Field12': 'World!', 'Field29': 'Stack', 'Field61': 'Overflow', 'Field73': '2024', 'Field97': 'helps.'}
目标:新DataFrame中仅填充上述6个字段,其余字段全部用默认值填充。请问怎么实现?能不能用列表/字典推导结合append或iloc方法?或者有没有Pandas自带的简单函数可以快速搞定?
解决方案
这里有几种高效的实现方式,完全不用手动列所有列名:
方法1:生成默认行后更新指定字段
这是最直接的方式,先基于原DataFrame的列生成一条全默认值的记录,再替换需要填充的字段:
import pandas as pd # 假设原DataFrame名为df default_value = 0 # 可替换为'No data'等自定义默认值 # 生成全默认值的单行DataFrame new_df = pd.DataFrame([{col: default_value for col in df.columns}]) # 用输入字典更新指定字段 update_dict = {'Field4': 'Hello', 'Field12': 'World!', 'Field29': 'Stack', 'Field61': 'Overflow', 'Field73': '2024', 'Field97': 'helps.'} new_df.loc[0, update_dict.keys()] = update_dict.values()
方法2:用reindex快速对齐列
先把输入字典转成单行DataFrame,再用原DataFrame的列做索引对齐,缺失列自动填充默认值:
import pandas as pd update_dict = {'Field4': 'Hello', 'Field12': 'World!', 'Field29': 'Stack', 'Field61': 'Overflow', 'Field73': '2024', 'Field97': 'helps.'} default_value = 0 # 字典转单行DataFrame后,对齐原DataFrame的列结构 new_df = pd.DataFrame([update_dict]).reindex(df.columns, fill_value=default_value)
方法3:基于原DataFrame空结构生成新行
先提取原DataFrame的空结构,再生成带默认值的新行并更新指定字段:
import pandas as pd update_dict = {'Field4': 'Hello', 'Field12': 'World!', 'Field29': 'Stack', 'Field61': 'Overflow', 'Field73': '2024', 'Field97': 'helps.'} default_value = 0 # 生成与原DataFrame列一致的默认值Series new_row = pd.Series(default_value, index=df.columns) # 更新指定字段 new_row.update(pd.Series(update_dict)) # 转成最终的DataFrame new_df = pd.DataFrame([new_row])
进阶:按数据类型设置不同默认值
如果需要给数值型列和字符串型列设置不同默认值,可以根据原DataFrame的字段类型生成对应默认值:
import pandas as pd update_dict = {'Field4': 'Hello', 'Field12': 'World!', 'Field29': 'Stack', 'Field61': 'Overflow', 'Field73': '2024', 'Field97': 'helps.'} # 按字段类型分配默认值:数值型用0,其他用'No data' default_dict = { col: 0 if df[col].dtype in ['int64', 'float64'] else 'No data' for col in df.columns } new_df = pd.DataFrame([default_dict]) new_df.loc[0, update_dict.keys()] = update_dict.values()
内容的提问来源于stack exchange,提问作者THill3
相关产品推荐
相关产品推荐

