使用pandas在数据框中添加空行

55

我试图在数据框的末尾附加一个空行,但无法做到,甚至尝试了解Pandas如何使用append函数,但仍然不理解。

以下是代码:

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

你能解释一下这段代码吗?很难判断你是想要添加行、列还是数据框? - silent_dev
@user3667569,我有一个包含多行和2列的xlsx数据,我需要在末尾添加一行空行。for循环只是我尝试过但没有成功的东西。 - Mansoor Akram
根据@Wes McKinney在https://dev59.com/gGgv5IYBdhLWcg3wSe0f的评论,这种方法效率低下,因为它涉及复制所有数据,所以最好避免在某些应用程序中使用。 - kuzzooroo
9个回答

73
使用pandas.DataFrame.append()添加新的pandas.Series。
如果您想指定新行的名称(也称为“索引”),请使用:
df.append(pandas.Series(name='NameOfNewRow'))

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

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

其中 df 是你的 pandas.DataFrame。


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

20
您可以通过将Series附加到数据框来添加它,如下所示。我假设您所说的空白是指您想要添加一个仅包含“NaN”的行。 您可以首先创建一个带有NaN的Series对象。在定义'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"行。 - Mansoor Akram
我该如何将当前的xlsx数据添加到DataFrame中? - Mansoor Akram
只需将当前数据加载到数据框中,然后更改此行中的索引参数以满足您的需求:s2 = pd.Series([Nan,Nan,Nan,Nan], index=['A', 'B', 'C', 'D'])。 - silent_dev
我已经尝试过了,但是出现了这个错误:“'DataFrame'对象没有'Series'属性”。 - Mansoor Akram
好的,成功完成了,谢谢。必须使用append函数设置"ignore_index=True"。 - Mansoor Akram
1
这个答案过于复杂。你不需要传入一列NaN,也不需要指定所有的索引。@pocketdora和srcerer的答案更简单,并且可以达到同样的效果。 - srcerer

5

将“空”行添加到数据框中并填充所选单元格:

生成空数据框(没有行,只有列a和b):

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

在数据框的末尾添加空行:
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

5
假设您有一个名为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

2
非常好,这更有用,并且可以在许多情况下使用,谢谢。 - Menglong Li
这是最佳解决方案,因为pandas不会抛出警告。 - Brad123

5
您可以添加一个新系列,并同时命名它。该名称将成为新行的索引,所有值都将自动变为NaN。
df.append(pd.Series(name='Afterthought'))

1
如果你不想给新系列命名,可以使用 df.append(pd.Series(), ignore_index=True) - srcerer

3
以下代码对我有效。
df.append(pd.Series([np.nan]), ignore_index = True)

6
它还会创建一个新的包含NaN值的列。 - Kerem
或者 df.append(pd.DataFrame([np.nan],columns=['A'])),其中 'A' 是 df 中任何一列的名称。Pandas 会自动将 NaN 填充到空列中。 - allenyllee
3
df.append(pd.Series(), ignore_index=True)将一个空的Series对象添加到DataFrame中,并忽略原有索引,使用新的自动索引。 - Darren Smith

1
假设您的 df.index 是排序的,您可以使用以下代码:
df.loc[df.index.max() + 1] = None

它可以很好地处理不同的索引和列类型。
[编辑] 如果有一个恒定的频率,它可以与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

这是一个Pandas数据框架,它有3列数据:时间戳、速度和文本。数据类型分别为datetime64、int64和object。该数据框架只包含一条记录,时间频率为L。内存使用量为32.0字节。
df.loc[df.index.max() + 1] = None
df.info()
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

0

@Dave Reikher的答案是最佳解决方案。

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

这里是一个没有使用NumPy库的类似答案。

df.loc[len(df.index)] = ['' for x in df.columns.values.tolist()]
  • len(df.index) = 行数。始终比索引计数多1。
  • 通过使用df.loc[len(df.index)],您可以选择下一个可用的索引号(行)。
  • df.iloc[-1].name + 1等于df.loc[len(df.index)]
  • 您可以使用Python推导式而不是NumPy
  • 从列名创建一个列表:df.columns.values.tolist()
  • 根据列数创建一个新的空字符串列表''。
  • ['' for x in df.columns.values.tolist()]

0

你也可以使用:

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

其中loc是您的空行索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接