python - 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
解决方案
从计算包含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中删除,请执行以下操作:
- 将指示的索引保存在专用变量中(下面代码中的ind)。
- 将具有这些索引的行复制到新的 DataFrame ( df2 )。
- 从源df中删除具有这些索引的行(就地)。
执行此操作的代码(而不是上面的最后一条指令)是:
ind = df.index[df.index.isin(s[s].index.union(s[s].index + 1))]
df2 = df.loc[ind]
df.drop(ind, inplace=True)
推荐阅读
- sql - 查看连接两个表
- javascript - 如何控制台记录 html 元素内的文本?
- javascript - 在 RxJS 中“一次一个”处理事件
- python - numpy:FutureWarning:元素比较失败
- firebase - 如何在一台机器上运行两个 firebase 实例来测试 Unity 中的多人构建?
- turing-machines - 从 ALLtm 减少到 Etm
- flutter - Dart/Flutter:没有为“搜索”类型定义吸气剂“长度”
- python - easymc.io 网络抓取绑定以提取值
- xpath - 在两个特定元素之间选择元素
- hugo - Hugo 错误模板:_default/single.html:20:16:在 <$img.Fill> 处执行“main”:调用填充时出错:*resources.genericResource 不是图像