现有几个与此类似的问题,但是答案很难理解,似乎都没有达到我想要的效果。
我有一个包含很多行和一行的数据框,其中包括一行要替换的占位符值:
old = pd.DataFrame(['A','B','placeholder','C','D'],index=[0,1,2,3,4])
我有另一个格式相同的数据框,我想将其插入占位符的位置:
new = pd.DataFrame(['E','F'],index=[0,1])
最终结果应如下所示:
0
0 A
1 B
2 E
3 F
4 C
5 D
我可以获得占位符行的索引:
ind = old.index[old[0]=='placeholder']
基于与此类似的其他问题,我认为以下代码应该可以实现我想要的功能:
old.loc[ind] = new
但不是,它只是将占位符替换为NaN。 然后,我尝试将新数据框中的索引更改为要替换的行之间:
new = pd.DataFrame(['E','F'],index=[2,2.5])
这正是我想要的,但是问题是我不知道如何自动执行索引分配。我正在使用的实际数据帧很大,并且已经有基于0的索引,因此我需要将new
的原始索引更改为类似的内容:
np.arange(ind, ind+1, 1/len(new))
但是在这里,我在两个方面感到困惑:
如何将ind
(占位符的索引)转换成我可以实际使用的格式?它目前是Int64Index
,所以我不能将其用于np.arange()
,并且ind.astype(float)
似乎什么也没做。
一旦有了新索引列表,如何用新索引替换new
中的现有索引?
或者,是否有一种完全有效的方法? 谢谢!
答案 0 :(得分:1)
old
中的索引是连续数字,因此我们可以对其进行一些利用。
第一步是读取(并保存)占位符行的索引:
plhInd = old.index[old[0] == 'placeholder'].tolist()[0]
然后,您可以生成2个数据帧:“之前”部分(old_1
)和
“之后”部分(old_2
):
old_1 = old[old.index < plhInd]
old_2 = old[old.index > plhInd]
然后,要获得结果,请将append
与ignore_index=True
(两个链接的调用)一起使用:
result = old_1.append(new, ignore_index=True).append(old_2, ignore_index=True)
print(result)
可以使您:
0
0 A
1 B
2 E
3 F
4 C
5 D
无需“重新生成”索引,因为在ignore_index=True
下
“以下”索引会自动生成。
答案 1 :(得分:0)
您可以修改new
的索引,将其添加到old
,然后对索引进行排序和重置。
import pandas as pd
idx = old.eq('placeholder').idxmax()[0]
new.index = idx + new.index/len(new)
pd.concat([old.drop(idx), new]).sort_index().reset_index(drop=True)
# 0
#0 A
#1 B
#2 E
#3 F
#4 C
#5 D
或拆分DataFrame
并将新部分连接到中间:
new = pd.DataFrame(['E','F'],index=[0,1]) # re-initialize
idx = old.eq('placeholder').idxmax()[0]
pd.concat([old.iloc[:idx], new, old.iloc[idx+1:]], ignore_index=True)
# 0
#0 A
#1 B
#2 E
#3 F
#4 C
#5 D