使用熊猫在数据框中追加一个空行

Posted

技术标签:

【中文标题】使用熊猫在数据框中追加一个空行【英文标题】:Append an empty row in dataframe using pandas 【发布时间】:2017-02-21 05:39:04 【问题描述】:

我试图在数据帧的末尾附加一个空行但无法这样做,甚至试图了解 pandas 如何使用附加功能但仍然没有得到它。

代码如下:

import pandas as pd

excel_names = ["ARMANI+EMPORIO+AR0143-book.xlsx"]
excels = [pd.ExcelFile(name) for name in excel_names]
frames = [x.parse(x.sheet_names[0], header=None,index_col=None).dropna(how='all') for x in excels]
for f in frames:
    f.append(0, float('NaN'))
    f.append(2, float('NaN'))

有两列和随机行数。

在for循环中使用“print f”我得到这个:

                             0                 1
0                   Brand Name    Emporio Armani
2                 Model number            AR0143
4                  Part Number            AR0143
6                   Item Shape       Rectangular
8   Dial Window Material Type           Mineral
10               Display Type          Analogue
12                 Clasp Type            Buckle
14               Case Material   Stainless steel
16              Case Diameter    31 millimetres
18               Band Material           Leather
20                 Band Length  Women's Standard
22                 Band Colour             Black
24                 Dial Colour             Black
26            Special Features       second-hand
28                    Movement            Quartz

【问题讨论】:

你能解释一下代码吗?很难判断您要添加的内容 - 行、列还是数据框? @user3667569 我在 xlsx 中有多行 2 列的数据,我需要在最后添加一个空行。 for 循环只是我尝试但没有运气的东西。 根据@Wes McKinney 对***.com/q/10715965/2829764 的评论,这是低效的,因此对于某些应用程序最好避免,因为它涉及复制所有数据。 【参考方案1】:

您可以通过将系列附加到数据框来添加它,如下所示。我假设你用空白表示你想添加一行只包含“Nan”。 你可以先用 Nan 创建一个 Series 对象。确保在 -Index 参数中定义“系列”对象时指定列。 您可以将其附加到 DF。希望对您有所帮助!

from numpy import nan as Nan
import pandas as pd

>>> df1 = pd.DataFrame('A': ['A0', 'A1', 'A2', 'A3'],
...                     'B': ['B0', 'B1', 'B2', 'B3'],
...                     'C': ['C0', 'C1', 'C2', 'C3'],
...                     'D': ['D0', 'D1', 'D2', 'D3'],
...                     index=[0, 1, 2, 3])

>>> s2 = pd.Series([Nan,Nan,Nan,Nan], index=['A', 'B', 'C', 'D'])
>>> result = df1.append(s2)
>>> result
     A    B    C    D
0   A0   B0   C0   D0
1   A1   B1   C1   D1
2   A2   B2   C2   D2
3   A3   B3   C3   D3
4  NaN  NaN  NaN  NaN

【讨论】:

我不明白添加“nan”行需要做什么。 如何在 DataFrame 中添加我当前的 xlsx 数据? 只需将您当前的数据加载到您的数据框中。然后替换此行中的 index 参数以满足您的需要: s2 = pd.Series([Nan,Nan,Nan,Nan], index=['A', 'B', 'C', 'D']) 。 我已经尝试过了并且收到此错误“'DataFrame' object has no attribute 'Series'” 这个答案过于复杂。您不需要传入 NaN 列表,也不需要指定所有索引。 @pocketdora 和 srcerer 的答案要简单得多,并且完成同样的事情。【参考方案2】:

下面的代码对我有用。

df.append(pd.Series([np.nan]), ignore_index = True)

【讨论】:

它还会创建一个新的 NaN 值列。 df.append(pd.DataFrame([np.nan],columns=['A'])),其中'A'是df中任何列的名称。 Pandas 会自动将 NaN 填充到空列中。 df.append(pd.Series(), ignore_index = True)【参考方案3】:

假设 df 是您的数据框,

df_prime = pd.concat([df, pd.DataFrame([[np.nan] * df.shape[1]], columns=df.columns)], ignore_index=True)

其中 df_prime 等于 df 加上最后一行 NaN。

请注意,pd.concat 很慢,因此如果您需要循环使用此功能,最好避免使用它。 在这种情况下,假设您的索引是增量的,您可以使用

df.loc[df.iloc[-1].name + 1,:] = np.nan

【讨论】:

很好,这个比较好用,很多情况下都可以用,thx【参考方案4】:

您可以添加一个新系列,并同时为其命名。该名称将是新行的索引,所有值将自动为 NaN。

df.append(pd.Series(name='Afterthought'))

【讨论】:

如果您不想为新系列命名,请使用df.append(pd.Series(), ignore_index=True)【参考方案5】:

使用 pandas.DataFrame.append() 添加一个新的 pandas.Series。

如果您希望指定新行的名称(也称为“索引”),请使用:

df.append(pandas.Series(name='NameOfNewRow'))

如果您不想命名新行,请使用:

df.append(pandas.Series(), ignore_index=True)

df 是你的 pandas.DataFrame。

【讨论】:

这也适用于类似日期时间的索引,方法是将日期时间对象传递给名称参数;例如df.append(pandas.Series(name=datetime.datetime(2018, 2, 1)))。结合df.sort_index(),新行被放置在正确的位置。 这是 pocketdora 的答案 + 一个更简单的选择。我对他们答案的编辑被拒绝了。我认为对这个非常基本的问题有一个单一的标准答案很重要。【参考方案6】:

假设您的 df.index 已排序,您可以使用:

df.loc[df.index.max() + 1] = None

它可以很好地处理不同的索引和列类型。

[EDIT] 如果存在恒定频率,则它与 pd.DatetimeIndex 一起使用,否则我们必须准确指定新索引,例如:

df.loc[df.index.max() + pd.Timedelta(milliseconds=1)] = None

长示例:

df = pd.DataFrame([[pd.Timestamp(12432423), 23, 'text_field']], 
                    columns=["timestamp", "speed", "text"],
                    index=pd.DatetimeIndex(start='2111-11-11',freq='ms', periods=1))
df.info()

<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 1 entries, 2111-11-11 to 2111-11-11 Freq: L Data columns (total 3 columns): timestamp 1 non-null datetime64[ns] speed 1 non-null int64 text 1 non-null object dtypes: datetime64[ns](1), int64(1), object(1) memory usage: 32.0+ bytes

df.loc[df.index.max() + 1] = None
df.info()

<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 2 entries, 2111-11-11 00:00:00 to 2111-11-11 00:00:00.001000 Data columns (total 3 columns): timestamp 1 non-null datetime64[ns] speed 1 non-null float64 text 1 non-null object dtypes: datetime64[ns](1), float64(1), object(1) memory usage: 64.0+ bytes

df.head()

                            timestamp                   speed      text
2111-11-11 00:00:00.000 1970-01-01 00:00:00.012432423   23.0    text_field
2111-11-11 00:00:00.001 NaT NaN NaN

【讨论】:

【参考方案7】:

你也可以使用:

your_dataframe.insert(loc=0, value=np.nan, column="")

loc 是您的空行索引。

【讨论】:

【参考方案8】:

将“空”行附加到数据框并填充选定的单元格:

生成空数据框(没有行,只有列 ab):

import pandas as pd    
col_names =  ["a","b"]
df  = pd.DataFrame(columns = col_names)

在数据框的end处追加空行:

df = df.append(pd.Series(), ignore_index = True)

现在填充a列中数据框末尾的空单元格(len(df)-1):

df.loc[[len(df)-1],'a'] = 123

结果:

     a    b
0  123  NaN

当然可以遍历行并填充单元格:

col_names =  ["a","b"]
df  = pd.DataFrame(columns = col_names)
for x in range(0,5):
    df = df.append(pd.Series(), ignore_index = True)
    df.loc[[len(df)-1],'a'] = 123

结果:

     a    b
0  123  NaN
1  123  NaN
2  123  NaN
3  123  NaN
4  123  NaN

【讨论】:

以上是关于使用熊猫在数据框中追加一个空行的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框追加问题

将空行插入或追加到 numpy 数组

列表追加到熊猫单元格中

熊猫:追加行小计的新列

无法在新数据框中追加行[重复]

将列表中的字典追加到熊猫数据框