【问题标题】:Add Pandas Series as a Row to Pandas DataFrame将 Pandas 系列作为一行添加到 Pandas DataFrame
【发布时间】:2020-03-04 15:20:16
【问题描述】:

我正在尝试将Pandas.Series 作为新行添加到Pandas.DataFrame。但是,Series 似乎总是被添加,其索引显示为单独的行。

我们怎样才能将它追加为一行?

import pandas as pd

df = pd.DataFrame([
    ('Tom', 'male', 10),
    ('Jane', 'female', 7),
    ('Peter', 'male', 9),
], columns=['name', 'gender', 'age'])
df.set_index(['name'], inplace=True)
print(df)
       gender  age
name              
Tom      male   10
Jane   female    7
Peter    male    9
s = pd.Series(('Jon', 'male', 12), index=['name', 'gender', 'age'])
print(s)
name       Jon
gender    male
age         12
dtype: object

预期结果

       gender  age
name              
Tom      male   10
Jane   female    7
Peter    male    9
Jon      male   12

尝试 1

df2 = df.append(pd.DataFrame(s))
print(df2)
           0   age  gender
Tom      NaN  10.0    male
Jane     NaN   7.0  female
Peter    NaN   9.0    male
name     Jon   NaN     NaN
gender  male   NaN     NaN
age       12   NaN     NaN

尝试 #2

df2 = pd.concat([df, s], axis=0)
print(df2)
           0   age  gender
Tom      NaN  10.0    male
Jane     NaN   7.0  female
Peter    NaN   9.0    male
name     Jon   NaN     NaN
gender  male   NaN     NaN
age       12   NaN     NaN

尝试 #3

df2 = pd.concat([df, pd.DataFrame(s)], axis=0)
print(df2)
           0   age  gender
Tom      NaN  10.0    male
Jane     NaN   7.0  female
Peter    NaN   9.0    male
name     Jon   NaN     NaN
gender  male   NaN     NaN
age       12   NaN     NaN

【问题讨论】:

    标签: python python-3.x pandas dataframe series


    【解决方案1】:

    这“有效”,但您可能首先要重新考虑如何构建数据框。如果您追加数据,请一次性完成,而不是逐行完成。

    >>> pd.concat([df, s.to_frame().T.set_index('name')])
           gender age
    name             
    Tom      male  10
    Jane   female   7
    Peter    male   9
    Jon      male  12
    

    作为数据框的一列,Series 通常都是相同的数据类型(例如age)。在这种情况下,您的系列代表给定记录的单行数据,例如数据库中具有可能混合类型的行。您可能希望将您的系列视为数据框行。

    row = pd.DataFrame({'gender': 'male', 'age': 12}, 
                       index=pd.Index(['Jon'], name='name'))
    >>> pd.concat([df, row])
           gender  age
    name              
    Tom      male   10
    Jane   female    7
    Peter    male    9
    Jon      male   12
    >>> pd.concat([df, row])
    

    【讨论】:

    • 根据场景,也可以直接赋值:df.loc[s['name'], ['gender', 'age']] = s[['gender', 'age']]
    • 谢谢,这行得通。 df.append 会比 df.concat 更受欢迎吗?
    • @Nyxynyx 这是一个偏好。我从其他人那里听说他们希望 append 函数永远不会作为公共函数公开,从而强制 concat 并返回一个新对象。
    • 如果换成单行的Pandas DataFrame,你觉得Pandas Series中表示的数据更合适吗?
    • 虽然不完全准确,但将 Series 视为数据框中的列是很有用的,所有这些列都包含相同的数据类型(例如 int、float、object 等)。根据您的用例,您可能需要考虑使用namedtupledocs.python.org/2/library/…
    猜你喜欢
    • 2014-12-06
    • 2019-08-17
    • 1970-01-01
    • 2017-05-21
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2017-06-04
    相关资源
    最近更新 更多