我有以下数据框:
Input:-
ID month Name
A1 2017.01 A
A1 2017.02 B
A1 2017.04 C
A2 2017.02 A
A2 2017.03 D
A2 2017.05 C
Output:-
ID month Name
A1 2017.01 A
A1 2017.02 B
A1 2017.03 B
A1 2017.04 C
A2 2017.02 A
A2 2017.03 D
A2 2017.04 D
A2 2017.05 C
我需要在序列中获取缺少的月份以及在它之前的月份的值,并且它出现在输入列表中。 考虑ID“A1”的示例。 “A1”有月份1,2,4并且缺少第3个月。所以我需要添加值为“A1”的行作为ID,将月份添加为“2017.03”并将名称添加为“B”。请注意,“名称”列应从输入中显示的正上方的行中获取其值。
如何在pandas或python中的任何其他方法中实现此目的。
任何帮助表示赞赏! 感谢
答案 0 :(得分:3)
让我们试试@ EFT的建议:
df['Date'] = pd.to_datetime(df.month.astype(str),format='%Y.%m')
df_out = df.set_index('Date').groupby('ID').resample('MS').asfreq().ffill().reset_index(level=0, drop=True)
df_out = df_out.reset_index()
df_out['month'] = df_out.Date.dt.strftime('%Y.%m')
df_out = df_out.drop('Date',axis=1)
print(df_out)
输出:
ID month Name
0 A1 2017.01 A
1 A1 2017.02 B
2 A1 2017.03 B
3 A1 2017.04 C
4 A2 2017.02 A
5 A2 2017.03 D
6 A2 2017.04 D
7 A2 2017.05 C
答案 1 :(得分:0)
评论中有一个问题,关于df如何知道要填充哪一列,我只是决定仔细阅读一下并将其张贴在这里,也许有人觉得它有用(或者我将其用作自己的参考): / p>
mytest = pd.DataFrame({'ID': ['A1', 'A1', 'A1', 'A2', 'A2', 'A2'], 'month': ['2017.01', '2017.02', '2017.04', '2017.02', '2017.03', '2017.05'], 'Name':['A','B','C','A','D','C']})
mytest.month = pd.to_datetime(mytest.month)
mytest=mytest.set_index('month').groupby(['ID'])
mytest = mytest.resample('MS').asfreq()['Name']
mytest = pd.DataFrame(pd.DataFrame(mytest).to_records())
mytest.Name = mytest.Name.ffill()
mytest
显然输出了一个非常类似的东西,我只是几个月还没有格式化回原始格式。
ID month Name
0 A1 2017-01-01 A
1 A1 2017-02-01 B
2 A1 2017-03-01 B
3 A1 2017-04-01 C
4 A2 2017-02-01 A
5 A2 2017-03-01 D
6 A2 2017-04-01 D
7 A2 2017-05-01 C