我有一个数据框架:

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]

并且我需要添加第一行[2,3,4],得到:

   A  B  C
0  2  3  4
1  5  6  7
2  7  8  9

我尝试过append()和concat()函数,但找不到正确的方法。

如何添加/插入系列数据帧?


当前回答

按照下面的例子做:

A_row = pd。系列([1,2])

Df = pd。DataFrame([[3,4], [5,6]])

row_df = pd.DataFrame([a_row])

Df = pd。concat([row_df, df], ignore_index=True)

结果是:

   0  1
0  1  2
1  3  4
2  5  6

其他回答

在pandas数据帧中添加一行的最简单方法是:

DataFrame.loc[ location of insertion ]= list( )

例子:

DF.loc[ 9 ] = [ ´Pepe’ , 33, ´Japan’ ]

注意:列表的长度应该与数据帧的长度相匹配。

您可以简单地将行追加到DataFrame的末尾,然后调整索引。

例如:

df = df.append(pd.DataFrame([[2,3,4]],columns=df.columns),ignore_index=True)
df.index = (df.index + 1) % len(df)
df = df.sort_index()

或者使用concat as:

df = pd.concat([pd.DataFrame([[1,2,3,4,5,6]],columns=df.columns),df],ignore_index=True)

我把一个简短的函数放在一起,在插入一行时允许更多的灵活性:

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

可以进一步缩写为:

def insert_row(idx, df, df_insert):
    return df.iloc[:idx, ].append(df_insert).append(df.iloc[idx:, ]).reset_index(drop = True)

然后你可以使用如下语句:

df = insert_row(2, df, df_new)

其中2是df中要插入df_new的索引位置。

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

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

要在任意位置插入新行,可以指定行位置: Row_pos = -1用于在顶部插入 或者row_pos = 0.5用于在第0行和第1行之间插入。

row_pos = -1
insert_row = [2,3,4]

df.loc[row_pos] = insert_row
df = df.sort_index()
df = df.reset_index(drop = True)

row_pos = -1

The outcome is:

    A   B   C
0   2   3   4
1   5   6   7
2   7   8   9

row_pos = 0.5

The outcome is:

    A   B   C
0   5   6   7
1   2   3   4
2   7   8   9

我突然想到,也许T属性是一个有效的选择。转置,可以避开误导人的df。Loc[-1] =[2,3,4],就像@flow2k提到的那样,它适用于更通用的情况,比如你想在任意行之前插入[2,3,4],这是concat(),append()难以实现的。没有必要为定义和调试函数而费心。

a = df.T
a.insert(0,'anyName',value=[2,3,4])
# just give insert() any column name you want, we'll rename it.
a.rename(columns=dict(zip(a.columns,[i for i in range(a.shape[1])])),inplace=True)
# set inplace to a Boolean as you need.
df=a.T
df

    A   B   C
0   2   3   4
1   5   6   7
2   7   8   9

我想这可以部分解释@MattCochrane抱怨为什么pandas没有像insert()那样插入一行的方法。