Python 条件转移到上一个类别
我想回答之前其他人提出的一个问题: 有人问到如何获取pandas上一辆同类型汽车的销售日期,用户询问的是条件转换功能。答案是一辆群车和一个班次,解决了这个问题。 现在,我想计算一辆不同(例如,按字典顺序排列的以前)类型的汽车的销售日期。因此,一个有条件的换档功能可以一直换档到某个条件(汽车类型改变)才能解决这个问题。你会怎么做?谢谢 编辑:Python 条件转移到上一个类别,python,pandas,Python,Pandas,我想回答之前其他人提出的一个问题: 有人问到如何获取pandas上一辆同类型汽车的销售日期,用户询问的是条件转换功能。答案是一辆群车和一个班次,解决了这个问题。 现在,我想计算一辆不同(例如,按字典顺序排列的以前)类型的汽车的销售日期。因此,一个有条件的换档功能可以一直换档到某个条件(汽车类型改变)才能解决这个问题。你会怎么做?谢谢 编辑: 它已经按照A和B进行了排序。先前的询问者想知道“A属于相同类型的B列的先前值是多少”。如您所见,在第0行中没有前一行,因此nan,在第1行中,前一行也有A=
它已经按照A和B进行了排序。先前的询问者想知道“A属于相同类型的B列的先前值是多少”。如您所见,在第0行中没有前一行,因此nan,在第1行中,前一行也有A=0=>previous=1.5,依此类推。我现在想要“B列的上一个值,其中A小于1”。这意味着对于A=0的所有行,我们没有A为-1的行。对于A=1的所有行,我们取A=0的最后一行,这里B是2.5。我希望这能解释清楚。您仍然可以使用
groupby
和shift
,但方式略有不同:
df = pd.DataFrame({'A': [0,0,0,1,1,2], 'B':[1.5,2,2.5,3.7,4,4.2]})
grouped = df.groupby('A', as_index=False).last().shift().B
grouped = pd.DataFrame(grouped)
pd.merge(df, grouped, left_on='A', right_index=True)
产出:
A B_x B_y
0 0 1.5 NaN
1 0 2.0 NaN
2 0 2.5 NaN
3 1 3.7 2.5
4 1 4.0 2.5
5 2 4.2 4.0
注意:这假设A包含从0到max(df.A)
编辑:差异并将B的第三个值更改为1
df = pd.DataFrame({'A': [0, 0, 0, 1, 1, 2], 'B': [1.5, 2, 2.5, 1, 4, 4.2]})
grouped = df.groupby('A', as_index=False).min().shift().B
grouped = pd.DataFrame(grouped)
merged = pd.merge(df, grouped, left_on='A', right_index=True)
print(np.abs(merged.B_x - merged.B_y))
产出:
0 NaN
1 NaN
2 NaN
3 0.5
4 2.5
5 3.2
dtype: float64
0 NaN
1 NaN
2 NaN
3 0.5
4 1.5
5 0.2
dtype: float64
编辑2: 这花了我一段时间,但我认为它现在起作用了。不要认为这是最好的解决方案,但它确实有效;) 产出:
0 NaN
1 NaN
2 NaN
3 0.5
4 2.5
5 3.2
dtype: float64
0 NaN
1 NaN
2 NaN
3 0.5
4 1.5
5 0.2
dtype: float64
现在在
a
中存储上一组的列表,然后可以将其合并到索引上的数据框中。然后对所有行应用函数f(x)
,这些行查找x.B_x
和x.B_y
的值之间的最小距离(列表)。您仍然可以使用groupby
和shift
,但方式略有不同:
df = pd.DataFrame({'A': [0,0,0,1,1,2], 'B':[1.5,2,2.5,3.7,4,4.2]})
grouped = df.groupby('A', as_index=False).last().shift().B
grouped = pd.DataFrame(grouped)
pd.merge(df, grouped, left_on='A', right_index=True)
产出:
A B_x B_y
0 0 1.5 NaN
1 0 2.0 NaN
2 0 2.5 NaN
3 1 3.7 2.5
4 1 4.0 2.5
5 2 4.2 4.0
注意:这假设A包含从0到max(df.A)
编辑:差异并将B的第三个值更改为1
df = pd.DataFrame({'A': [0, 0, 0, 1, 1, 2], 'B': [1.5, 2, 2.5, 1, 4, 4.2]})
grouped = df.groupby('A', as_index=False).min().shift().B
grouped = pd.DataFrame(grouped)
merged = pd.merge(df, grouped, left_on='A', right_index=True)
print(np.abs(merged.B_x - merged.B_y))
产出:
0 NaN
1 NaN
2 NaN
3 0.5
4 2.5
5 3.2
dtype: float64
0 NaN
1 NaN
2 NaN
3 0.5
4 1.5
5 0.2
dtype: float64
编辑2: 这花了我一段时间,但我认为它现在起作用了。不要认为这是最好的解决方案,但它确实有效;) 产出:
0 NaN
1 NaN
2 NaN
3 0.5
4 2.5
5 3.2
dtype: float64
0 NaN
1 NaN
2 NaN
3 0.5
4 1.5
5 0.2
dtype: float64
现在在
a
中存储上一组的列表,然后可以将其合并到索引上的数据框中。然后对所有行应用函数f(x)
,这些行查找x.B_x
和x.B_y
的值之间的最小距离(列表)。您能举个例子吗?我觉得有点难以理解你到底想要什么。你能举个例子吗?我觉得有点难以理解你到底想要什么。太好了,谢谢!很抱歉,这可能与主题无关,但对于我的concreate应用程序场景,我不需要最后一个元素,但我想要距离最小的元素。因此,输出应该是[Nan,Nan,Nan,1.2,1.5,0.2]。merged.B_x-merged.B_y
返回一个有差异的序列,并且(merged.B_x-merged.B_y).min()是其中的最小值。这不是我想要的,只是在这里B已经在上升。设置df.loc[3,'B']=1。那么你的差异都是-1.5。然而,我想要的是从第3行中的B值到A=0的任何行的最小距离,即0.5。这就是我也想到“条件移位”的原因。然后,我只按B排序,只要找到一行a与我的条件匹配,我就会向后移动。不,我不希望这样。我不想要团体中最小/最大的价值。对于每一行,我想找到“previous”组的值,该值使与curernt值的差异最小化。因此,对于行3,我们考虑所有行,其中A=0,如行3,我们有A=1。第3行中B的值为:3.7。然后将差异最小化3.7-2.5。对于第4行,差异也减小了4.0-2.5。对于行5,我们考虑所有行的A=1,差最小化4.2~4,谢谢!很抱歉,这可能与主题无关,但对于我的concreate应用程序场景,我不需要最后一个元素,但我想要距离最小的元素。因此,输出应该是[Nan,Nan,Nan,1.2,1.5,0.2]。merged.B_x-merged.B_y
返回一个有差异的序列,并且(merged.B_x-merged.B_y).min()是其中的最小值。这不是我想要的,只是在这里B已经在上升。设置df.loc[3,'B']=1。那么你的差异都是-1.5。然而,我想要的是从第3行中的B值到A=0的任何行的最小距离,即0.5。这就是我也想到“条件移位”的原因。然后,我只按B排序,只要找到一行a与我的条件匹配,我就会向后移动。不,我不希望这样。我不想要团体中最小/最大的价值。对于每一行,我想找到“previous”组的值,该值使与curernt值的差异最小化。因此,对于行3,我们考虑所有行,其中A=0,如行3,我们有A=1。第3行中B的值为:3.7。然后将差异最小化3.7-2.5。对于第4行,差异也减小了4.0-2.5。对于行5,我们考虑所有行,其中A=1,差最小为4.2到4。