【发布时间】:2020-11-09 17:04:10
【问题描述】:
我有一个这样的数据框
df = pd.DataFrame({'id': [205,205,205, 211, 211, 211]
, 'date': pd.to_datetime(['2019-12-01','2020-01-01', '2020-02-01'
,'2019-12-01' ,'2020-01-01', '2020-03-01'])})
df
id date
0 205 2019-12-01
1 205 2020-01-01
2 205 2020-02-01
3 211 2019-12-01
4 211 2020-01-01
5 211 2020-03-01
date 的列是按连续月份为id 205 而不是id 211。
我只想保留我有没有跳跃的月度数据的观察值 (id)。在这个例子中我想要:
id date
0 205 2019-12-01
1 205 2020-01-01
2 205 2020-02-01
这里我收集id留着:
keep_id = []
for num in pd.unique(df.index):
temp = (df.loc[df['id']==num,'date'].dt.year - df.loc[df['id']==num,'date'].shift(1).dt.year) * 12 + df.loc[df['id']==num,'date'].dt.month - df.loc[df['id']==num,'date'].shift(1).dt.month
temp.values[0] = 1.0 # here I correct the first entry
if (temp==1.).all():
keep_id.append(num)
我使用(df.loc[num,'date'].dt.year - df.loc[num,'date'].shift(1).dt.year) * 12 + df.loc[num,'date'].dt.month - df.loc[num,'date'].shift(1).dt.month 计算每个id 与前一个date 的月差。
在df 的一小部分测试时,这似乎有效,但我确信有更好的方法来做到这一点,也许使用.groupby() 方法。
由于df 由数百万个观察组成,我的代码花费了太多时间(我想学习一种更高效和 Python 的方法)
【问题讨论】:
-
强烈建议您不要将您的索引设置为
id列。如果这样做,您的索引将不再具有每一行的唯一值,并且会失去大部分功能和实用性。 -
好的,谢谢。我在想。我现在就改!
标签: python pandas date data-manipulation