Python 如何拆分值并在数据框中插入新行?

Python 如何拆分值并在数据框中插入新行?,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据框: id sub_id timestamp dist time_dif speed status 1 1 1 2016-07-01 00:01:00 20 00:01:00 0.0075 True 2 1 1 2016-07-01 00:01:59 29 00:00:59 0.3450 True 3 1

我有以下数据框:

      id  sub_id  timestamp            dist     time_dif     speed     status
   1   1   1      2016-07-01 00:01:00  20       00:01:00     0.0075    True
   2   1   1      2016-07-01 00:01:59  29       00:00:59     0.3450    True
   3   1   1      2016-07-01 00:03:00  30       00:01:00     0.0987    True
   4   1   2      2016-07-01 00:03:59  21       00:59:00     0.5319    True
   5   1   2      2016-07-01 00:05:00  40       00:01:00     0.0076    False 
在上述数据框中,只要距离>30,状态=False

我想建议创建一个函数或方法,以便无论何时状态为“false”,即距离>30,(在上面的数据框中,第5行),我都可以执行以下操作:

处理status=False的行(第5行)

第5行“dist”下的值(其中status=False,dist=40)变为30,因为30是阈值距离,不能大于30。 所以,40-30=10,这个额外的10应该移到下一行

“状态”变为“真”(距离=30)

“速度”不变

“id”、“sub_id”保持不变

“time_diff”有一个新值,因为第5行有速度和距离,所以可以计算时间

“timestamp”也应该更改,如果我们计算time_diff,我们可以将time_diff添加到第4行的“time”值中,并为第5行获得新的时间戳

处理下一行(第6行)

现在,只要dist>30/status=False,就应该在数据帧中插入第6行或下一行,这样前一行中的任何额外距离都会进入这一新行

在上例中,第6行下的“dist”的值为(40-30)ie 10

“id”保持不变

“sub_id”变为3(增加1)

由于10现在小于30,“状态”应该为真

“速度”保持不变

“时间差”将再次使用第6行中的“距离”和“速度”值进行计算

“timestamp”也将通过将“time_diff”添加到前一行“timestamp”的值来计算

而数据框中的其余行将照常进行,直到遇到状态为False的另一行

此外,也可能存在“dist”=70的情况,因此在这种情况下,dist=70的行应具有dist=30,然后下一行应具有dist=40,该值仍然大于30,因此它也应仅保留30,并在下一行中插入剩余的10

如果有什么不清楚的地方,请告诉我。
提前感谢。

我还没有包括距离、时间和速度字段的更改,但想法应该是类似的。让我知道这是否有效,我将尝试从那里添加编辑。由于对您迭代的对象进行更改通常是不好的,所以我创建了一个新的数据帧来存储更改

df2 = pd.DataFrame(columns = df.columns)
limit = 30
Index = 0
for row in df.itertuples():
    if row[7] == False: # 7 is the index of the status column
        tempRow = list(row[:])
        tempRow[4]=limit # 4 is the index of the dist column
        tempRow[7] = True
        df2.loc[Index] = tempRow
        Index +=1
        tempRow[4] = row[4]-limit
        tempRow[7] = tempRow[7] < limit
        tempRow [2]= row[2]+1 # 2 is the index of the sub_id column
        df2.loc[Index] = tempRow
    else:
        df2.loc[Index] = row
    Index += 1
df2
df2=pd.DataFrame(columns=df.columns)
上限=30
索引=0
对于df.itertuples()中的行:
如果行[7]==False:#7是状态列的索引
tempRow=列表(第[:]行)
tempRow[4]=limit#4是dist列的索引
tempRow[7]=真
df2.loc[Index]=tempRow
指数+=1
tempRow[4]=行[4]-限制
tempRow[7]=tempRow[7]
因此,为了确保我的理解正确,在发生更改时您也会覆盖现有行?@AsheKetchum Yes,status=False的行将被新值覆盖。另外,下面是创建新行的过程,新行的剩余距离在“dist”和相应的值下。存在
iterrows()
itertuples()
,允许您迭代数据帧,然后您可以使用
df.loc[nextRowsIndex]==newRow
创建新行。此外,创建新行时,是否希望它直接位于创建新行的行的下方?假设您有
[true,false,true,true]
,是否将
false
的分离组件插入第三行?还是会附加在最后?@AsheKetchum是的,是的,就是这样,它应该在那一行的正下方。新行应该增加“sub_id”。非常感谢,我会处理这个问题,如果我发现任何困难,请告诉你。非常感谢。如果您想处理dist为70(大于30*2)的情况,可能需要更改/组合第一个if语句和while循环,那么这将使您完成一次迭代