通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是啥?

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

我之所以喜欢这个解决方案,是因为它让我不再需要建立索引,因此我可以在之后根据其他标准建立索引。

【讨论】:

以上是关于通过某些(索引)参数将值插入熊猫数据框中“适当”位置的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫数据框中插入列名? [复制]

填补熊猫数据框中的日期空白

熊猫对多个数据框求和

熊猫数据框中的逻辑索引[重复]

如何重新索引熊猫数据框以将起始索引值重置为零? [重复]

如何更改熊猫数据框中的单个索引值?