Python 应用groupby后如何在dataframe中添加列
我有这样的数据帧Python 应用groupby后如何在dataframe中添加列,python,pandas,Python,Pandas,我有这样的数据帧 id Date 546451991 2018-07-31 00:00:00 546451991 2018-08-02 00:00:00 5441440119 2018-08-13 00:00:00 5441440119 2018-08-13 00:00:00 5441440119 2018-08-14 00:00:00 5344265358 2018-07-13 00:00:00
id Date
546451991 2018-07-31 00:00:00
546451991 2018-08-02 00:00:00
5441440119 2018-08-13 00:00:00
5441440119 2018-08-13 00:00:00
5441440119 2018-08-14 00:00:00
5344265358 2018-07-13 00:00:00
5344265358 2018-07-15 00:00:00
5441438884 2018-07-19 00:00:00
我想按“ID”分组,然后根据日期排序,然后添加一列,其中包含下一行的日期
例如,我想要这样的输出
id Date Date1
546451991 2018-07-31 00:00:00 2018-08-02 00:00:00
546451991 2018-08-02 00:00:00 NULL
5441440119 2018-08-13 00:00:00 2018-08-14 00:00:00
5441440119 2018-08-14 00:00:00 2018-08-15 00:00:00
5441440119 2018-08-15 00:00:00 NULL
5344265358 2018-07-13 00:00:00 2018-07-15 00:00:00
5344265358 2018-07-15 00:00:00 NULL
5441438884 2018-07-19 00:00:00 NULL
我尝试过,但没有成功
df.groupby('id')['Date'].sort_values()
不工作
df['Date1'] = df.groupby('id')['Date'].apply(lambda x: x.sort_values().shift(-1))
输出:
编辑
从sandeep输入
df['Date1'] = df.groupby('id')['Date'].shift(-1)
这可能就是你想要的,虽然@Naga Kiran的答案是一句话,但我只是一步一步地简化
import pandas as pd
df = pd.DataFrame({"id":[1, 2, 3, 4], "Date":["2018-07-01", "2018-08-01", "2018-09-02", "2018-10-03"]})
newdf = df.sort_values(["Date"], ascending=False)
newdf["Date1"] = newdf["Date"].transform(lambda x:x.shift(-1))
newdf.groupby("id").head(3)
我首先对数据帧进行排序,然后用shift(-1)
添加Date1,将列值上移一行,然后执行groupby(“id”)
希望这有帮助 我想你的意思是“下一行”而不是“下一列”?你不清楚你想在df中做什么样的排序,是升序还是降序?你能发布一个预先制作的df吗?我在试着从剪贴板上把它转换成可测试的格式时,我在犹豫了很长一段时间,当时我应该尝试回答这个问题。我尝试了你的代码,但它给了我以下错误类型错误:插入列的索引与框架索引不兼容。我再次检查了代码,它给出了相同的结果。您是否使用id作为索引?否,但我的索引不是按递增顺序排列的。缺少值,例如1,2,4,7,8,9,10请重置索引df。重置索引(drop=True,inplace=True)是@sandepkadapa,我没有想到;-)
import pandas as pd
df = pd.DataFrame({"id":[1, 2, 3, 4], "Date":["2018-07-01", "2018-08-01", "2018-09-02", "2018-10-03"]})
newdf = df.sort_values(["Date"], ascending=False)
newdf["Date1"] = newdf["Date"].transform(lambda x:x.shift(-1))
newdf.groupby("id").head(3)