Python 比较>;=列,然后在比较的基础上删除另一列,减去1并执行,直到满足条件

Python 比较>;=列,然后在比较的基础上删除另一列,减去1并执行,直到满足条件,python,pandas,vectorization,series,strip,Python,Pandas,Vectorization,Series,Strip,慢慢地,但肯定地,我正在学习这条巨蟒/熊猫,但大多数时候,它让我心烦意乱。我正在进行一个项目,该项目将比较两列(一次一行),然后在同一行的另一列上应用lstrip操作。基本上,如果[count column]大于[column1],则lstrip[column2(任何数字和/或.periods)],然后lstrip[column2(“|”)一次,然后从[count column]中减去1然后重新开始此过程。此过程应持续到“count”列编号等于“column1”编号,然后停止。但是“column

慢慢地,但肯定地,我正在学习这条巨蟒/熊猫,但大多数时候,它让我心烦意乱。我正在进行一个项目,该项目将比较两列(一次一行),然后在同一行的另一列上应用lstrip操作。基本上,如果[count column]大于[column1],则lstrip[column2(任何数字和/或.periods)],然后lstrip[column2(“|”)一次,然后从[count column]中减去1然后重新开始此过程。此过程应持续到“count”列编号等于“column1”编号,然后停止。但是“column2”中的所有字段的编号长度不同,有些字段的运行时间会比其他字段长

当前,代码将运行并同时删除'column2'中的所有行,并从'count'列中的所有行中减去1。它将一直运行,直到'count'列达到负数。这意味着当'count'列等于'column1'时,它不会停止该行的操作

我的想法是一次处理一行,当“count”列等于column1时,继续下一行,然后重新开始该过程。冲洗并重复,直到完成。然而,在尝试查找示例时,我发现以下链接说明pandas旨在运行整个系列(column)通过一次操作与我一次一行的思维逻辑

<http://shorturl.at/acvIL>

不需要多次执行逻辑,您可以使用
apply
lambda
函数一次完成。其思想是在
|
上拆分,然后在基于
列1
进行切片后重新合并所有内容

df['column1'] = df['column1'].astype(int)
df['column2'] = df.apply(lambda x: '|'.join(x.column2.split('|')[:x.column1 + 1]), axis=1)

   column1                                           column2  count
0        7                                   0|0|0|0|0|0|0|0      7
1        2                                       369|369|219      2
2        3                           413.1|413.1|413.1|413.1      3
3        6  228.65|228.65|228.65|322.15|322.15|322.15|228.65      6
4        4                               359|359|359|359|359      4

不需要多次执行逻辑,您可以使用
apply
lambda
函数一次完成。其思想是在
|
上拆分,然后在基于
列1
进行切片后重新合并所有内容

df['column1'] = df['column1'].astype(int)
df['column2'] = df.apply(lambda x: '|'.join(x.column2.split('|')[:x.column1 + 1]), axis=1)

   column1                                           column2  count
0        7                                   0|0|0|0|0|0|0|0      7
1        2                                       369|369|219      2
2        3                           413.1|413.1|413.1|413.1      3
3        6  228.65|228.65|228.65|322.15|322.15|322.15|228.65      6
4        4                               359|359|359|359|359      4

嘿,ScootCork,现在看看这个。我喜欢这个理想的….!我替换了最后三行(就在打印(df)上面)并删除了df['columns']行和接收到错误。假设是这样?错误:TypeError:切片索引必须是整数或无或具有索引方法。这让我感觉excel工作表是以字符串或其他形式出现的。错误读取必须是整数,那么我如何对此进行测试?你的想法是什么?那么看看下面的excel文件ss在第1列和计数列中,数字后面都有小数点和六个零。我正在阅读如何将这些数字转换为整数,以便我可以运行您的代码。将cxast的答案调整为int,您实际上不需要计数,因此将其简化了一点。鉴于您的问题,这是一个可能的解决方案,如果它不起作用请说明它不起作用的原因或调整/澄清您的问题。最好有一个最小的可复制的示例。这样,其他有类似问题的人也会得到帮助。ScootCork,我能够用原始DF实现这一点。如果知道我编写的整个代码都是无关的,而不是eeded,我们本可以避免这种反复。然而,在花了一些时间试图理解lambda&apply之后,我开始破译您的代码。问题实际上是我在count列中计算“|”和str语句的代码。您的代码无法将列2更改为整数。因此,我完全放弃了我的代码,只使用d一行代码,稍作调整。感谢您打开我的眼睛看smtg diff。嘿,ScootCork,现在看看这个。我喜欢这个理想状态。我替换了最后三行(就在打印(df)上方),并删除了df['columns']行和接收到错误。假设是这样?错误:TypeError:切片索引必须是整数或无或具有索引方法。这让我感觉excel工作表是以字符串或其他形式出现的。错误读取必须是整数,那么我如何对此进行测试?你的想法是什么?那么看看下面的excel文件ss在第1列和计数列中,数字后面都有小数点和六个零。我正在阅读如何将这些数字转换为整数,以便我可以运行您的代码。将cxast的答案调整为int,您实际上不需要计数,因此将其简化了一点。鉴于您的问题,这是一个可能的解决方案,如果它不起作用请说明它不起作用的原因或调整/澄清您的问题。最好有一个最小的可复制的示例。这样,其他有类似问题的人也会得到帮助。ScootCork,我能够用原始DF实现这一点。如果知道我编写的整个代码都是无关的,而不是eeded,我们本可以避免这种反复。然而,在花了一些时间试图理解lambda&apply之后,我开始破译您的代码。问题实际上是我在count列中计算“|”和str语句的代码。您的代码无法将列2更改为整数。因此,我完全放弃了我的代码,只使用d一行代码,稍作调整。感谢您让我了解smtg diff。