通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是啥?
Posted
技术标签:
【中文标题】通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是啥?【英文标题】:What's the best way to insert values into their "proper" place in a pandas dataframe by some (index) parameter?通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是什么? 【发布时间】:2018-12-28 07:22:20 【问题描述】:我有一个数据框,df
,如下所示:
Word Row ID Remark
abc 1 xyz
def 2 xyz
ghi 4 uvw
jkl 5 qrs
mno 7 wxy
缺失值在另一个数据框中,df1
:
Word Row ID Remark
pqr 3 uuu
stu 6 vvv
我想将df1
中的缺失值插入df1
中的适当位置,因此这是所需的输出:
Word Row ID Remark
abc 1 xyz
def 2 xyz
pqr 3 uuu
ghi 4 uvw
jkl 5 qrs
stu 6 vvv
mno 7 wxy
我的代码如下:
for i in range(len(df1)): # run through each of the missing values
if df2['Row ID'][i] not in range(min(df['Row ID']), df2['Row ID'][i]):
df.loc[-1] = df2.loc[i] # adding a row with -1 index
df.index += 1 # shifting index so that it does not overwrite the current value in that position
df = df.sort_values('Row ID')
但是,我认为这并不是最有效的方法,因为:
-
有一个 for 循环。我认为必须有一种矢量化的方式来做到这一点。
在 for 循环的末尾有一个排序操作。我认为如果有一种矢量化方式,它将在该步骤本身中包含排序,而不是在单独的步骤中进行。
【问题讨论】:
既然你在最后排序,只需将帧连接在一起并排序:df = pd.concat([df, df1]).sort_values('Row ID')
@ALollz 哦,太好了。但是由于某种原因,这会颠倒列的顺序,并且还会添加另一列 Index
作为结果数据帧的第一列。
Word
你的索引也是?
不,我只是说它为插入的行添加了另一个名为Index
的列,其值为NaN
,并且为已经存在的行添加了原始索引值。
【参考方案1】:
使用searchsorted
,个人认为concat
+sort_values
也可以解决问题。
df1.index=np.searchsorted(df.RowID.values,df1.RowID.values)
pd.concat([df1,df]).sort_index()
Out[187]:
Word RowID Remark
0 abc 1 xyz
1 def 2 xyz
2 pqr 3 uuu
2 ghi 4 uvw
3 jkl 5 qrs
4 stu 6 vvv
4 mno 7 wxy
【讨论】:
我收到以下错误:AttributeError: 'DataFrame' object has no attribute 'RowID'
@Kristada673 将df.RowID
更改为df['Row ID']
@Kristada673 然后打印你的 df.columns
Index(['Word', 'Row ID', 'Remark'], dtype='object')
@Kristada673 np.searchsorted(df['Row ID']values,df['Row ID'].values)
【参考方案2】:
您是否尝试过合并?鉴于两个数据框在列的数量和名称方面具有相同的结构。否则,您可以从主数据框中提取此类订单,并使用您需要的参考值创建一个合并的订单:
df1 = pd.DataFrame('Word' : [ "pqr","stu"],
'rowid' : [ '3','6'],
'Remark' : ['uuu', 'vvv'])
df2 = pd.DataFrame('Word' : ["abc", "def", "ghi", "jkl", "mno"],
'rowid' : ['1', '2', '4','5', '7'],
'Remark' : ['xyz', 'xyz', 'uvw', 'vvv', 'wxy'])
并合并:
df1['rowid'] = df1['rowid'].astype(int)
df2['rowid'] = df2['rowid'].astype(int)
dfmerg = pd.merge(df2, df1, how = "outer",sort=True)
dfmerg.sort_values('rowid')
哪个输出
Word rowid Remark
0 abc 1 xyz
1 def 2 xyz
5 pqr 3 uuu
2 ghi 4 uvw
3 jkl 5 vvv
6 stu 6 vvv
4 mno 7 wxy
我之所以喜欢这个解决方案,是因为它让我不再需要建立索引,因此我可以在之后根据其他标准建立索引。
【讨论】:
以上是关于通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章