如何执行条件数据帧操作?

时间:2017-03-25 18:45:36

标签: python-3.x pandas dataframe

给定df

A = pd.DataFrame([[1, 5, 2, 1, 2], [2, 4, 4, 1, 2], [3, 3, 1, 1, 2], [4, 2, 2, 3, 0], 
              [5, 1, 4, 3, -4], [1, 5, 2, 3, -20], [2, 4, 4, 2, 0], [3, 3, 1, 2, -1], 
              [4, 2, 2, 2, 0], [5, 1, 4, 2, -2]],
             columns=['a', 'b', 'c', 'd', 'e'],
             index=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

如何在'f'列中更改值之前创建一列'e',该列对应于列'd'中的最后一个值,并保留该值直到下一次更改为止列'd'中的值输出为:

    a   b   c   d   e    f
1   1   5   2   1   2    nan
2   2   4   4   1   2    nan
3   3   3   1   1   2    nan
4   4   2   2   3   0     2
5   5   1   4   3   -4    2
6   1   5   2   3   -20   2
7   2   4   4   2   0    -20
8   3   3   1   2   -1   -20
9   4   2   2   2   0    -20
10  5   1   4   2   -2   -20

修改 @Noobie提供了一种解决方案,当应用于实际数据时,如果小于'd'列中的先前值

2 个答案:

答案 0 :(得分:4)

我认为我们应该为处理连续的群体提供更好的原生支持,但在此之前你可以使用compare-cumsum-groupby模式:

g = (A["d"] != A["d"].shift()).cumsum()
A["f"] = A["e"].groupby(g).last().shift().loc[g].values

给了我

In [41]: A
Out[41]: 
    a  b  c  d   e     f
1   1  5  2  1   2   NaN
2   2  4  4  1   2   NaN
3   3  3  1  1   2   NaN
4   4  2  2  2   0   2.0
5   5  1  4  2  -4   2.0
6   1  5  2  2 -20   2.0
7   2  4  4  3   0 -20.0
8   3  3  1  3  -1 -20.0
9   4  2  2  3   0 -20.0
10  5  1  4  3  -2 -20.0

这是有效的,因为g是与每个连续的d值组相对应的计数。请注意,在这种情况下,使用您发布的示例,g与列“d”相同,但不一定是这种情况。获得g后,我们可以使用它对列e进行分组:

In [55]: A["e"].groupby(g).last()
Out[55]: 
d
1     2
2   -20
3    -2
Name: e, dtype: int64

然后

In [57]: A["e"].groupby(g).last().shift()
Out[57]: 
d
1     NaN
2     2.0
3   -20.0
Name: e, dtype: float64

In [58]: A["e"].groupby(g).last().shift().loc[g]
Out[58]: 
d
1     NaN
1     NaN
1     NaN
2     2.0
2     2.0
2     2.0
3   -20.0
3   -20.0
3   -20.0
3   -20.0
Name: e, dtype: float64

答案 1 :(得分:1)

很容易,我的朋友。释放POWER OF PANDAS

A.sort_values(by = 'd', inplace = True)
A['lag'] = A.e.shift(1)
A['output'] = A.groupby('d').lag.transform(lambda x : x.iloc[0])

A
Out[57]: 
    a  b  c  d   e   lag  output
1   1  5  2  1   2   NaN     NaN
2   2  4  4  1   2   2.0     NaN
3   3  3  1  1   2   2.0     NaN
4   4  2  2  2   0   2.0     2.0
5   5  1  4  2  -4   0.0     2.0
6   1  5  2  2 -20  -4.0     2.0
7   2  4  4  3   0 -20.0   -20.0
8   3  3  1  3  -1   0.0   -20.0
9   4  2  2  3   0  -1.0   -20.0
10  5  1  4  3  -2   0.0   -20.0