我有一个数据框架:
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()函数,但找不到正确的方法。
如何添加/插入系列数据帧?
下面是在不排序和重置索引的情况下将一行插入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)
我把一个简短的函数放在一起,在插入一行时允许更多的灵活性:
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"])
df = df.transpose()
df.insert(0, 2, [2,3,4])
df = df.transpose()
df.index = [i for i in range(3)]
df
A B C
0 2 3 4
1 5 6 7
2 7 8 9
对于那些想要连接前一个数据帧的行,使用双括号([[…]])作为iloc。
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
pd.concat((df.iloc[[0]], # [[...]] used to slice DataFrame as DataFrame
df), ignore_index=True)
# A B C
# 0 5 6 7
# 1 5 6 7
# 2 7 8 9
若要复制或复制任意时间,请与星号组合。
pd.concat((df.iloc[[0]],
df,
*[df.iloc[[1]]] * 4), ignore_index=True)
# A B C
# 0 5 6 7
# 1 7 8 9
# 2 7 8 9
# 3 7 8 9
# 4 7 8 9