创建数据框行而不单独指定每个列值?

问题描述 投票:0回答:1

注意:我在这些论坛上找到的唯一关于此问题的帖子是关于 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 函数可以快速、轻松、简单地完成此操作?

python pandas dataframe
1个回答
0
投票

假设来自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
© www.soinside.com 2019 - 2024. All rights reserved.