Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 条件转移到上一个类别_Python_Pandas - Fatal编程技术网

Python 条件转移到上一个类别

Python 条件转移到上一个类别,python,pandas,Python,Pandas,我想回答之前其他人提出的一个问题: 有人问到如何获取pandas上一辆同类型汽车的销售日期,用户询问的是条件转换功能。答案是一辆群车和一个班次,解决了这个问题。 现在,我想计算一辆不同(例如,按字典顺序排列的以前)类型的汽车的销售日期。因此,一个有条件的换档功能可以一直换档到某个条件(汽车类型改变)才能解决这个问题。你会怎么做?谢谢 编辑: 它已经按照A和B进行了排序。先前的询问者想知道“A属于相同类型的B列的先前值是多少”。如您所见,在第0行中没有前一行,因此nan,在第1行中,前一行也有A=

我想回答之前其他人提出的一个问题: 有人问到如何获取pandas上一辆同类型汽车的销售日期,用户询问的是条件转换功能。答案是一辆群车和一个班次,解决了这个问题。 现在,我想计算一辆不同(例如,按字典顺序排列的以前)类型的汽车的销售日期。因此,一个有条件的换档功能可以一直换档到某个条件(汽车类型改变)才能解决这个问题。你会怎么做?谢谢

编辑:


它已经按照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。