我想从DataFrame中获取给定的行,并将其前置或追加到同一DataFrame中。
我下面的代码就是这样做的,但是我不确定我是否用正确的方法来做,或者是否有更简单,更好,更快的方法?
testdf = df.copy()
#get row
target_row = testdf.ix[[2],:]
#del row from df
testdf.drop([testdf.index[2]], axis=0, inplace=True)
#concat original row to end or start of df
newdf = pd.concat([testdf, target_row], axis=0)
谢谢
6条答案
按热度按时间7gyucuyw1#
而不是concat,我会在
shift
ing之后直接赋值给df,然后使用iloc
引用你想要赋值的行的位置,你必须调用squeeze
,这样你就只赋值了,失去了原始的索引值,否则它会引发一个ValueError
:编辑
在末尾插入:
另一个更新
感谢@AsheKetchum指出我之前的答案是不正确的,现在3年后再看这个,我意识到你可以只
reindex
orig df:如果我们将索引的副本作为
list
:然后我们可以从这个列表中
pop
感兴趣的索引:现在我们可以通过在这个列表前面添加
reindex
:或追加:
b1uwtaje2#
为了提高性能,您可能需要考虑保留一个包含所有要移动到DataFrame末尾的行的运行列表,然后在一个
pd.concat
操作中一次性移动这些行。smdncfj33#
我可以把它简化成一行代码:
我看不出你的代码和我的代码之间有任何性能差异。据推测,抄袭是最大的罪魁祸首。
t98cgbkg4#
类似于YH Wu写的,如果你知道指数(或指数),你可以在一行中完成。但是,ix已被弃用,因此请使用loc:
.drop删除具有您作为参数给予的索引(或多个索引)的行。使用df.loc[x]选择索引为x的行。如果你写df = df.drop…,则直接将更改应用于原始DataFrame。如果你想重置索引,你可以执行“.reset_index(drop=True)”(如果你不想将原始索引作为新列保留,则drop=True)。
8mmmxcuj5#
如果需要按值移动行(例如您知道索引的名称,但不知道它的位置)。然后,您可以使用以下内容(假设索引的值为2):
其逻辑如下:
这种方法的优点:
1.可以用于任何数量的索引,你想移动
1.可以很容易地修改,将所需的索引移动到前面而不是后面
1.无硬编码:我们按值而不是按位置移动索引
1.列表理解提供了良好的性能
ykejflvf6#
我只是删除一行并在末尾追加。