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

Posted

技术标签:

【中文标题】如何在熊猫数据框中拆分值并插入新行?【英文标题】:How to split a value and insert new row in pandas data frame? 【发布时间】:2017-04-27 15:17:52 【问题描述】:

我有以下数据框:

      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 

在上面的数据框中,status = False,只要距离>30。

我想对创建函数或方式提出建议,以便每当状态为“false”时,这意味着距离 > 30,(在上述数据框中,第 5 行)我可以执行以下操作:

处理 status = False (ROW 5) 的行

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

“状态”变为“真”(因为 dist = 30)

“速度”保持不变,

“id”、“sub_id”保持不变

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

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

处理下一行 (ROW 6)

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

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

“id”保持不变,

“sub_id”变成3(加1),

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

“速度”保持不变。

“time_diff”将再次使用第 6 行中的“dist”和“speed”值进行计算。

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

虽然数据框中的其余行照常跟随,直到遇到另一行 status = False。

另外,可能存在“dist” = 70的情况,所以在这种情况下,dist = 70的行应该有dist = 30,那么下一行应该有dist = 40,仍然大于30,所以它应该只保留 30 个,并将剩余的 10 个插入下一行。

如果有任何不清楚的地方,请告诉我。 提前致谢。

【问题讨论】:

为了确保我理解正确,当发生更改时,您还会覆盖现有行吗? @AsheKetchum 是的,status= False 的行将被新值覆盖。此外,以下是新行的创建,该行将具有“dist”下的剩余距离和相应的值。 存在iterrows()itertuples() 可以让您遍历数据框,然后您可以使用df.loc[nextRowsIndex]==newRow 创建新行。 另外,当您创建一个新行时,您是否希望它直接位于创建它的行的下方?假设你有[true, false, true, true]false 的分离组件会插入第三行吗?还是会在最后附加? @AsheKetchum 是的,就是这样,它应该在该行的正下方。并且新行应该增加了“sub_id”。 【参考方案1】:

我没有包括对距离、时间和速度字段的更改,但想法应该是相似的。让我知道这是否有效,我会尝试从那里添加编辑。由于对您迭代的对象进行更改通常很糟糕,因此我创建了一个新的 DataFrame 来存储更改。

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

【讨论】:

非常感谢,我会处理这个问题,如果我发现任何困难,请告诉你。非常感谢 这将使您完成一次迭代 如果要处理 dist 为 70(大于 30*2)的情况,可能需要将第一个 if 语句与 while 循环更改/组合

以上是关于如何在熊猫数据框中拆分值并插入新行?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Pandas 数据框中的特定位置插入一列? (更改熊猫数据框中的列顺序)

如何将文本文件中的原始数据加载到熊猫数据框中?

熊猫数据框在不同的数据框中查找一个值并分配一个值

在(一个非常大的)熊猫数据框中定位值并存储到字典中

如何根据字节大小拆分熊猫数据帧