我面临的问题是我有一个Pandas数据帧,每天都会保存变量V1的状态。我只对变量何时更改其状态以及新状态是什么感兴趣。
test_dataframe = pd.DataFrame()
test_dataframe['V1'] = ['X','Y','X','X','Y','X','Y','X']
test_dataframe['Status'] = ['A','C','B','B','D','B','D','A']
test_dataframe['Date'] = [pd.to_datetime('2017-1-1'),pd.to_datetime('2017-1-2'),pd.to_datetime('2017-1-3'),pd.to_datetime('2017-1-4'),pd.to_datetime('2017-1-5'),pd.to_datetime('2017-1-6'),pd.to_datetime('2017-1-7'),pd.to_datetime('2017-1-8')]
print(test_dataframe)
导致以下数据框
V1 Status Date
0 X A 2017-01-01
1 Y C 2017-01-02
2 X B 2017-01-03
3 X B 2017-01-04
4 Y D 2017-01-05
5 X B 2017-01-06
6 Y D 2017-01-07
7 X A 2017-01-08
我感兴趣的是:变量何时更改其状态,以及新状态是什么?
结果应为:
V1 Status Date
-----------------
X A date_1
X B date_3
X A date_8
Y C date_2
Y D date_5
有人可以帮忙吗? THX
答案 0 :(得分:1)
您可以使用groupby
+ apply
-
df = df.groupby('V1', group_keys=False)\
.apply(lambda x: x[x.Status.ne(x.Status.shift())])\
.reset_index(drop=True)
df
V1 Status Date
0 X A 2017-01-01
1 X B 2017-01-03
2 X A 2017-01-08
3 Y C 2017-01-02
4 Y D 2017-01-05
x.Status.ne(x.Status.shift())
位会找到Status
中发生变化的行。
答案 1 :(得分:1)
您可以对Status
列进行分解,并检查diff
是否不为零。
f = lambda s: pd.Series(s.factorize()[0], s.index)
mask = f(test_dataframe.Status).groupby(test_dataframe.V1).diff().ne(0)
test_dataframe[mask]
V1 Status Date
0 X A 2017-01-01
1 Y C 2017-01-02
2 X B 2017-01-03
4 Y D 2017-01-05
7 X A 2017-01-08