【问题标题】:Appending a Pandas Series as a row in a DataFrame, ignoring non-matching columns将 Pandas 系列作为一行添加到 DataFrame 中,忽略不匹配的列
【发布时间】:2019-08-17 12:52:34
【问题描述】:

假设我有以下 Pandas 数据框,但还没有行:

'Jeep' | 'Volvo' | 'Honda'
--------------------------

我有以下熊猫系列:

Honda    5
Nissan   3
Jeep     7
Toyota   2

我想将此系列添加为一行(不包括与列名不匹配的元素)

结果:

'Jeep' | 'Volvo' | 'Honda'
----------------------------
   7   |    0    |    5

可以这样做吗?

【问题讨论】:

  • df = pd.DataFrame(); df.append(pd.DataFrame(pd.Series([1,2,3], index=['a', 'b', 'c'])).T)
  • 这可能与您不太相关,但collections.Counter 更优雅地处理添加两个计数器、缺少键等的语义。此外,如果您有完整的汽车制造商列表,是否可以更简单地预先将 df 初始化为它,并且计数为零?

标签: python pandas dataframe append series


【解决方案1】:
import pandas as pd
df = pd.DataFrame(columns=['Jeep', 'Volvo', 'Honda'])  
s = pd.Series({"Honda": 5, "Nissan": 3, "Jeep": 7, "Toyota": 2})  

df.append(s[df.columns], ignore_index=True).fillna(0)

【讨论】:

  • 好主意,只是我的一点调整:-)
  • 最细微的调整,哈哈
  • 大声笑,是的 :-) :p
【解决方案2】:

您可以使用append 而不是获取特定列:

>>> import pandas as pd
>>> df = pd.DataFrame(columns=['Jeep', 'Volvo', 'Honda'])
>>> s = pd.Series([5, 3, 7, 2],index=['Honda', 'Nissan', 'Jeep', 'Toyota'])
>>> df1 = df.append(s, ignore_index=True)
>>> df1[df.columns].fillna(0)
   Jeep  Volvo  Honda
0   7.0    0.0    5.0
>>> 

这段代码实际上是:

>>> df1 = df.append(s, ignore_index=True)
>>> df1[df.columns].fillna(0)
   Jeep  Volvo  Honda
0   7.0    0.0    5.0
>>> 

【讨论】:

  • 这似乎也将“日产”添加为一列。我希望它忽略列中尚未出现的任何内容。
【解决方案3】:

您可以通过以下几种不同的方式使用reindex

series.to_frame().T.reindex(df.columns, axis=1, fill_value=0)

   Jeep  Volvo  Honda
0     7      0      5

series.reindex(df.columns, fill_value=0).to_frame().T

   Jeep  Volvo  Honda
0     7      0      5

df.append(series.reindex(df.columns, fill_value=0).rename(len(df)))

  Jeep Volvo Honda
0    7     0     5

【讨论】:

    猜你喜欢
    • 2020-03-04
    • 2014-12-06
    • 2017-05-21
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 2022-07-06
    • 2020-10-26
    • 2014-05-19
    相关资源
    最近更新 更多