我有一个数据帧..
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文档索引:使用放大设置.
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)
小智 11
在 pandas 中添加一行非常简单DataFrame:
创建一个与您的列名称相同的常规 Python 字典Dataframe;
使用pandas.append()方法并传入您的字典名称,其中.append()是 DataFrame 实例上的方法;
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
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.
这可能看起来过于简单,但令人难以置信的是,没有内置简单的插入新行函数。我已经阅读了很多关于将新的 df 附加到原始文件的内容,但我想知道这是否会更快。
df.loc[0] = [row1data, blah...]
i = len(df) + 1
df.loc[i] = [row2data, blah...]
Run Code Online (Sandbox Code Playgroud)
我们可以使用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告诉函数要放置新值的位置/索引。
以下是在不排序和重置索引的情况下将行插入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.append()对于大型数据帧更有效。
比较使用dictand的性能list,list效率更高,但对于小数据帧,使用 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 次循环)
| 归档时间: |
|
| 查看次数: |
280978 次 |
| 最近记录: |