首页 > 解决方案 > Panda Dataframe 比较成对的行,如果它们通过,则将它们移动到新的数据框

问题描述

我有一个熊猫数据框,我想将列数据与下一行中的数据进行比较。我可以看到循环是如何实现的,但是有没有更好的方法可以用熊猫来做到这一点?

所以对于名称 - 如果前两个字符与下一行的名称列中的前两个字符相同。“SH”==“DR”也是如此。然后我想检查第 1 行 BS == 第 2 行 BS 是否是卖 == 卖。

如果找到符合要求的对,则应将其删除并添加到新的 DF 中。

   name  BS
1  SH-0  sell
2  DR-P  sell <-3 pairs meets conditions and move to new df
3  DR-0   buy <-
4  SH-P  sell <-
5  SH-0   buy <-
6  LI-0   buy
7  SH-P  sell <-
8  SH-0   buy <-
9  SH-P   buy

Result new df

   name   BS
1  DR-P  sell
2  DR-0   buy
3  SH-P  sell
4  SH-0   buy
5  SH-P  sell
6  SH-0   buy

标签: pythonpandasdataframe

解决方案


从计算包含name列中前 2 个字符的Series开始:

name2 = df.name[:].str[:2]

(为了简化下一条语句,指的是这些字符)。

然后计算另一个Series持有“想要的”行对中第一行的索引:

s = name2.eq(name2.shift(-1)) & name2.ne(name2.shift())\
    & df.BS.ne(df.BS.shift(-1))

细节:

  • name2.eq(name2.shift(-1))- name2 == name2在下一行,
  • name2.ne(name2.shift())- name2 != name2在上一行,
  • df.BS.ne(df.BS.shift(-1))- BS != BS在下一行。

最后一步是检索“想要的”行:

df[df.index.isin(s[s].index.union(s[s].index + 1))]

请注意对union的调用以进行合并:

  • 来自s 的“原始”索引(每对中第一行的索引),
  • 每对中第二行的索引(原始索引 + 1)。

如您所见,此解决方案基于df中的索引值是连续数字的假设(在您的情况下满足)。

如何从源df中删除“想要的”行

注意df.index.isin(s[s].index.union(s[s].index + 1))表示“想要的”行(布尔索引)。要生成新的 DataFrame并将它们从df中删除,请执行以下操作:

  1. 将指示的索引保存在专用变量中(下面代码中的ind)。
  2. 将具有这些索引的行复制到新的 DataFrame ( df2 )。
  3. 从源df中删除具有这些索引的行(就地)。

执行此操作的代码(而不是上面的最后一条指令)是:

ind = df.index[df.index.isin(s[s].index.union(s[s].index + 1))]
df2 = df.loc[ind]
df.drop(ind, inplace=True)

推荐阅读