在pandas数据帧中插入一行

Mel*_*oun 92 python pandas

我有一个数据帧..

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

   A  B  C
0  5  6  7
1  7  8  9

[2 rows x 3 columns]
Run Code Online (Sandbox Code Playgroud)

我需要添加第一行[2,3,4]才能获得..

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9
Run Code Online (Sandbox Code Playgroud)

我已经尝试了append()和concat()函数,但不知怎的,我找不到正确的方法如何做到这一点.

有任何想法吗?有没有直接的方法如何添加/插入数据帧系列?

Pio*_*dal 120

只需将行分配给特定索引,使用loc:

 df.loc[-1] = [2, 3, 4]  # adding a row
 df.index = df.index + 1  # shifting index
 df = df.sort_index()  # sorting by index
Run Code Online (Sandbox Code Playgroud)

你可以按照需要得到:

    A  B  C
 0  2  3  4
 1  5  6  7
 2  7  8  9
Run Code Online (Sandbox Code Playgroud)

请参阅Pandas文档索引:使用放大设置.

  • 如果您不想对索引进行任何重新排序,您可以执行`df.loc[len(df)] = [2,3,4]`。当然,这假设帧中的最后一个索引是“len(df)-1”。然而,我使用的大多数数据框的结构都是这样的。 (7认同)
  • 转移索引替代:df.sort().reset_index(drop = True) (6认同)
  • 如果您不想设置放大,但在数据框内插入,请查看http://stackoverflow.com/questions/15888648/is-it-possible-to-insert-a-row-at-an -arbitrary位置-IN-A-数据帧使用锅?RQ = 1 (2认同)
  • 不推荐使用df.sort,使用df.sort_index() (2认同)
  • 我认为`df.loc [-1] = [2,3,4]#添加一行`有点误导,因为-1不是Python数组的最后一行/元素。 (2认同)

Foo*_*Bar 19

实现这一目标的一种方法是

>>> pd.DataFrame(np.array([[2, 3, 4]]), columns=['A', 'B', 'C']).append(df, ignore_index=True)
Out[330]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9
Run Code Online (Sandbox Code Playgroud)

通常,最简单的方法是附加数据帧,而不是序列.在您的情况下,因为您希望新行"在顶部"(具有起始ID),并且没有函数pd.prepend(),所以我首先创建新数据帧然后追加旧数据.

ignore_index将忽略数据帧中旧的正在进行的索引,并确保第一行实际上以索引开始,1而不是使用索引重新启动0.

典型免责声明:Cetero censeo ......附加行是一种效率很低的操作.如果您关心性能并且能够以某种方式确保首先使用正确的(更长)索引创建数据框,然后只是其他行插入数据框中,那么您肯定应该这样做.看到:

>>> index = np.array([0, 1, 2])
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[0:1] = [list(s1), list(s2)]
>>> df2
Out[336]: 
     A    B    C
0    5    6    7
1    7    8    9
2  NaN  NaN  NaN
>>> df2 = pd.DataFrame(columns=['A', 'B', 'C'], index=index)
>>> df2.loc[1:] = [list(s1), list(s2)]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我们拥有你所拥有的df:

>>> df2
Out[339]: 
     A    B    C
0  NaN  NaN  NaN
1    5    6    7
2    7    8    9
Run Code Online (Sandbox Code Playgroud)

但现在您可以按如下方式轻松插入行.由于空间已预先分配,因此效率更高.

>>> df2.loc[0] = np.array([2, 3, 4])
>>> df2
Out[341]: 
   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9
Run Code Online (Sandbox Code Playgroud)


mgi*_*ert 17

不确定你是如何调用concat()但只要两个对象属于同一类型它就应该工作.也许问题是你需要将第二个向量转换为数据帧?使用您定义的df以下内容适用于我.

>>>df2 = pd.DataFrame([[2,3,4]],columns=['A','B','C'])
>>>pd.concat([df2,df])
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案^:) (4认同)
  • 难道不应该稍微修改一下才能正确完成这项工作吗?我认为 @mgilbert 的代码在 0 处插入行,但我们最终得到了索引为 0 的两行。我认为需要修改第二行以使其看起来像下面的 pd.concat([df2, df]).reset_index(drop =正确) (3认同)
  • @Thesmelloofroses 或者,更好的是,`pd.concat([df2, df],ignore_index=True)` (2认同)

小智 11

在 pandas 中添加一行非常简单DataFrame

  1. 创建一个与您的列名称相同的常规 Python 字典Dataframe

  2. 使用pandas.append()方法并传入您的字典名称,其中.append()是 DataFrame 实例上的方法;

  3. ignore_index=True在您的字典名称之后添加。

  • 这可能是最可取的选择(大约 2020 年)。 (3认同)
  • 该函数没有“inplace”参数,因此:“df = df.append(your_dict,ignore_index=True)” (3认同)
  • 追加已被弃用一段时间了 (3认同)

elP*_*tor 8

我整理了一个简短的函数,在插入行时可以提供更多的灵活性:

def insert_row(idx, df, df_insert):
    dfA = df.iloc[:idx, ]
    dfB = df.iloc[idx:, ]

    df = dfA.append(df_insert).append(dfB).reset_index(drop = True)

    return df
Run Code Online (Sandbox Code Playgroud)

可以进一步缩短为:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用类似的东西:

df = insert_row(2, df, df_new)
Run Code Online (Sandbox Code Playgroud)

这里2是在索引位置df要插入df_new.


Aar*_*gar 8

这可能看起来过于简单,但令人难以置信的是,没有内置简单的插入新行函数。我已经阅读了很多关于将新的 df 附加到原始文件的内容,但我想知道这是否会更快。

df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]
Run Code Online (Sandbox Code Playgroud)


Tai*_*Tai 6

我们可以使用numpy.insert。这具有灵活性的优点。您只需要指定要插入的索引。

s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])

df = pd.DataFrame([list(s1), list(s2)],  columns =  ["A", "B", "C"])

pd.DataFrame(np.insert(df.values, 0, values=[2, 3, 4], axis=0))

    0   1   2
0   2   3   4
1   5   6   7
2   7   8   9
Run Code Online (Sandbox Code Playgroud)

对于np.insert(df.values, 0, values=[2, 3, 4], axis=0),0告诉函数要放置新值的位置/索引。


Sag*_*hod 5

以下是在不排序和重置索引的情况下将行插入pandas数据框的最佳方法:

import pandas as pd

df = pd.DataFrame(columns=['a','b','c'])

def insert(df, row):
    insert_loc = df.index.max()

    if pd.isna(insert_loc):
        df.loc[0] = row
    else:
        df.loc[insert_loc + 1] = row

insert(df,[2,3,4])
insert(df,[8,9,0])
print(df)
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 pd.isna 来避免导入 numpy (2认同)

kov*_*awa 5

测试一些答案很明显,使用pd.append()对于大型数据帧更有效。

比较使用dictand的性能listlist效率更高,但对于小数据帧,使用 adict应该没问题,并且更具可读性。


第一 - pd.append() + list

%%timeit
df = pd.DataFrame(columns=['a', 'b'])
for i in range(10000):
    df = pd.concat([pd.DataFrame([[1,2]], columns=df.columns), df], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

每个循环4.88 s ± 47.1 ms(平均值 ± 标准偏差,7 次运行,每个循环 1 次)

第二 - pd.append() + dict

%%timeit

df = pd.DataFrame(columns=['a', 'b'])
for i in range(10000):
    df = df.append({'a': 1, 'b': 2}, ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

每个循环10.2 s ± 41.4 ms(平均值 ± 标准偏差,7 次运行,每个循环 1 次)

第三个 - pd.DataFrame().loc + index operations

%%timeit
df = pd.DataFrame(columns=['a','b'])
for i in range(10000):
    df.loc[-1] = [1,2]
    df.index = df.index + 1
    df = df.sort_index()
Run Code Online (Sandbox Code Playgroud)

每个循环17.5 s ± 37.3 ms(平均值 ± 标准偏差,7 次运行,每次 1 次循环)

  • 请注意,`.append()` 已弃用 [自 v1.4.0(2022 年 1 月)起](https://pandas.pydata.org/pandas-docs/stable/whatsnew/v1.4.0.html#deprecated-dataframe-追加和系列追加) (16认同)