在python中的数据框中插入Missing Months行

时间:2017-06-15 20:01:43

标签: python python-3.x pandas

我有以下数据框:

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中的任何其他方法中实现此目的。

任何帮助表示赞赏! 感谢

2 个答案:

答案 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