Python 使用pandas在数据帧中追加空行

Python 使用pandas在数据帧中追加空行,python,python-2.7,pandas,Python,Python 2.7,Pandas,我试图在dataframe的末尾追加一个空行,但无法这样做,甚至试图理解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_c

我试图在dataframe的末尾追加一个空行,但无法这样做,甚至试图理解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

您可以通过如下方式向数据帧追加一个系列来添加它。我假设为空白,您的意思是要添加仅包含“Nan”的行。 可以首先使用Nan创建序列对象。确保在-Index参数中定义“Series”对象时指定列。 您可以将其附加到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

下面的代码对我有用

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

假设
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

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

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

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

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

df.append(pandas.Series(name='NameOfNewRow'))
df.append(pandas.Series(), ignore_index=True)

如果不希望命名新行,请使用:

df.append(pandas.Series(name='NameOfNewRow'))
df.append(pandas.Series(), ignore_index=True)

其中,
df
是您的pandas.DataFrame。

假设您的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()

日期时间索引:1个条目,2111-11-11到2111-11-11
频率:L
数据列(共3列):
时间戳1非空datetime64[ns]
速度1非空int64
文本1非空对象
数据类型:datetime64[ns](1)、int64(1)、object(1)
内存使用:32.0+字节

df.loc[df.index.max() + 1] = None
df.info()
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

日期时间索引:2个条目,2111-11-11 00:00:00至2111-11-11 00:00:00.001000
数据列(共3列):
时间戳1非空datetime64[ns]
速度1非空浮点64
文本1非空对象
数据类型:datetime64[ns](1)、float64(1)、object(1)
内存使用:64.0+字节

df.loc[df.index.max() + 1] = None
df.info()
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
您还可以使用:

your_dataframe.insert(loc=0, value=np.nan, column="")
其中,
loc
是空行索引。

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

     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
生成空数据框(没有行,只有列
a
b
):

在数据帧末尾追加空行:

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

当然,我们可以迭代行并填充单元格:

     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
结果:

     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

你能解释一下代码吗?很难判断您要添加什么-行、列还是数据帧?@user3667569我在xlsx中有多行两列的数据,我需要在末尾添加一个空行。for循环是我一直在尝试的事情,但运气不佳。根据@Wes McKinney对此的评论,这是效率低下的,因此对于某些应用程序最好避免,因为它涉及复制所有数据。我不明白我需要做什么来添加“nan”行。我将如何在DataFrame中添加我当前的xlsx数据?只需将当前数据加载到数据框中即可。然后替换此行中的index参数以满足您的需要:s2=pd.Series([Nan,Nan,Nan,Nan],index=[A','B','C','D'])。我已经尝试过了,并且得到了这个错误“'DataFrame'对象没有属性'Series'”。这个答案不必要地复杂。您不需要传入NAN列表,也不需要指定所有索引@pocketdora和srcerer的答案要简单得多,并且完成了相同的任务。它还创建了一个新的NaN值列。或者
df.append(pd.DataFrame([np.NaN],columns=['a'])
,其中'a'是df中任何列的名称。Pandas将自动将NaN填充为空列.df.append(pd.Series(),ignore_index=True)如果您不想命名新系列,请使用
df.append(pd.Series(),ignore_index=True)
这也适用于类似datetime的索引,方法是将datetime对象传递给name参数;e、 g.
df.append(pandas.Series(name=datetime.datetime(2018,2,1)))
。结合
df.sort_index()
,新行被放置在正确的位置。这是pocketdora的答案+一个更简单的选择。我对他们答案的编辑被拒绝了。我认为对这个非常基本的问题有一个单一的、标准的答案是很重要的。很好,这更有用,可以在很多情况下使用,thx