假设我们有一个数据框列,如下所示:
import pandas as pd
import numpy as np
x = np.linspace(1, 25, num=25)
df=pd.DataFrame(np.sin(x)* np.random.randint(10,50),columns=['Curve'])
df2=pd.DataFrame(np.linspace(4,5,num=5))
df = df['Curve'].append(df2)
df.index=(range(len(df)))
现在让我们说,我们想通过找到五个数字的序列来找到附加到原始数据帧的五个数字,所有这些数字之间的增量差小于1。我该怎么做呢?最好采用一种可以同时作用于数据帧内所有列的方式。
我知道在这种情况下,我只是将它们附加到末尾,但这是因为我仍在学习如何操作数据框的过程,并且不确定如何在其中轻松插入5个新值。列的“中间”(欢迎包括如何执行此操作,我们将不胜感激)。这只是一个说明性示例,但我想学习将其应用于更复杂的数据集的概念。
我当时正在考虑将“ if”与索引移位模块和布尔索引一起使用,但是在尝试之前,我想知道是否有更优雅,更直接的方法。
答案 0 :(得分:1)
下面的代码片段可以满足您的需求。首先,检查与前一行相距小于1.0的行。为了赶上该组的第一行,请对下一行执行相同的操作。将它们与np.logical_or合并,并再次使用shift键来创建组号。
最后,过滤我们创建的具有所有“ True”值的组;也就是说,组中的每个值都在其邻居中。一旦我们有了全阳性组,就选最大的一组(不一定是五个一组)。一旦获得该组号,请从原始df返回这些行。
df.columns = ['curve']
a = abs(df.curve - df.curve.shift()) < 1.0
b = abs(df.curve - df.curve.shift(-1)) < 1.0
c = np.logical_or(a, b)
d = (c != c.shift()).cumsum()
df['c'] = c
df['d'] = d
df = df.groupby(d).filter(lambda x: all(x['c']))
max_group = df.loc[df.groupby(d).cumcount().idxmax()]['d']
df_added = df.loc[df['d'] == max_group]
编辑:我还应该注意,对您原始问题的评论中提出的关注是有效的。