注意:我在这些论坛上找到的唯一关于此问题的帖子是关于 SQL INSERT 语句的,而不是关于 Python DataFrames 的。
背景:
我有一个包含很多列的数据框。到底有多少对于这个问题来说并不重要。可以说,这个数字足够大,一次写出各个列(甚至复制它们并指定每一列)是不可行的。
我想创建具有相同列(相同列数、相同列标签)的第二个数据帧,但仅填充新数据帧字段的稀疏子集(这是原始数据帧中总列数的一小部分) )。我想在新记录的每个其他字段中放置一个默认值(也许是
0
)。
这是一个小例子。我知道这个例子可以通过手动指定列名来暴力解决。正如我之前指出的,在我的情况下写出新行的每个字段名称是不可行的。
原DF:
|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.'}
目标是在新的数据框中(与原始数据框具有相同的列)仅填充这六个字段,其他所有内容都获得默认输入(0,“无数据”,等等)。
如何做到这一点?某种列表/字典理解与附加(或 iloc)命令相结合?有没有一个简单的 pandas 函数可以快速、轻松、简单地完成此操作?
假设来自OP的初始数据帧:
df = pd.DataFrame(
{
"Field1": ["DATA1-", "DATA1-", "------"],
"Field2": ["------", "Data2-", "Data2-"],
"Field3": ["Data3-", "Data3-", "------"],
"Field101": ["--------", "--------", "Data101-"],
"Field102": ["Data102-", "Data102-", "--------"],
"Field103": ["--------", "Data103-", "--------"],
}
)
Field1 Field2 Field3 Field101 Field102 Field103
0 DATA1- ------ Data3- -------- Data102- --------
1 DATA1- Data2- Data3- -------- Data102- Data103-
2 ------ Data2- ------ Data101- -------- --------
您可以将数据构建为
dict
到 str
的 list
,使用它创建一个新数据帧,然后连接原始数据帧和新数据帧:
data_dict = {
"Field1": ["Hello"],
"Field2": ["World!"],
"Field3": ["Stack"],
"Field101": ["Overflow"],
}
new_df = pd.concat([df, pd.DataFrame(data_dict)])
Field1 Field2 Field3 Field101 Field102 Field103
0 DATA1- ------ Data3- -------- Data102- --------
1 DATA1- Data2- Data3- -------- Data102- Data103-
2 ------ Data2- ------ Data101- -------- --------
0 Hello World! Stack Overflow NaN NaN
不存在的值将用
NaN
填充。您可以使用 fillna
替换它们:
new_df = new_df.fillna(0)
Field1 Field2 Field3 Field101 Field102 Field103
0 DATA1- ------ Data3- -------- Data102- --------
1 DATA1- Data2- Data3- -------- Data102- Data103-
2 ------ Data2- ------ Data101- -------- --------
0 Hello World! Stack Overflow 0 0