我有以下熊猫DataFrame:
import pandas as pd
df = pd.DataFrame({"datetime": ["30.12.1999 00:59:00", "30.12.1999 23:59:00", "31.12.1999 00:59:00", "31.12.1999 23:59:00"], "b": [4, 15, 26,7]})
df["datetime"] = pd.to_datetime(df.datetime)
df["date"]=df.datetime.dt.date
如下所示:
datetime b date
0 1999-12-30 00:59:00 4 1999-12-30
1 1999-12-30 23:59:00 15 1999-12-30
2 1999-12-31 00:59:00 26 1999-12-31
3 1999-12-31 23:59:00 7 1999-12-31
数据框实际上有更多行,但是以下原则仍然有效:一天只有两行。
我想得到b
的两个值之间的差。因此,在上面的示例中,我希望得到一个如下所示的数据框:
date b_delta
0 1999-12-30 11
1 1999-12-31 -19
我该如何实现?
答案 0 :(得分:4)
最简单的方法是:
df.set_index('date').groupby('date')['b'].diff().reset_index(name='b_delta').dropna()
输出:
date b_delta
1999-12-30 11.0
1999-12-31 -19.0
答案 1 :(得分:1)
我将索引设置为date
并按其分组,然后在列diff
上使用b
减去连续值。然后,您可以仅选择非null值:
g = df.set_index('date').groupby(level=0).b.diff()
g[g.notnull()]
date
1999-12-30 11.0
1999-12-31 -19.0
Name: b, dtype: float64
您可以将其设置为具有所需b_delta
标头的数据框,如下所示:
>>> g[g.notnull()].to_frame('b_delta')
b_delta
date
1999-12-30 11.0
1999-12-31 -19.0
编辑:我忽略了使用dropna
的方法,这确实是解决问题的方法(就像@AbhinavSood的好答案,实际上应该是被接受的答案...):< / p>
df.set_index('date').groupby(level=0).b.diff().dropna().to_frame('b_delta')