Python:根据条件将行添加到数据框

时间:2019-08-07 13:46:45

标签: python python-3.x jupyter-notebook

我有以下表格/数据框

 Year    Period    Amount 
 2010      1         10
 2010      2         5
 2010      4         6
 2010      5         9
 2011      1         10
 2011      3         5
 2011      4         3

如您所见,“期间”列中有缺失的期间。我想为每年添加一行,其中缺少期限,金额为0。 我还希望句点继续到我定义的数字,例如6。 因此,结果数据框应为:

 Year    Period    Amount 
 2010      1         10
 2010      2         5
 2010      3         0
 2010      4         6
 2010      5         9 
 2010      6         0
 2011      1         10 
 2011      2         0 
 2011      3         5
 2011      4         3
 2011      5         0
 2011      6         0

1 个答案:

答案 0 :(得分:2)

这是我运行代码的答案。

1。设置示例变量

In [1]:
data = [[2010, 1, 10], [2010, 2, 5], [2010, 4, 6], [2010, 5, 9], [2011, 1, 10], [2011, 3, 5], [2011, 4, 3]]
df = pd.DataFrame(data, columns = ['Year', 'Period', 'Amount'])
df
Out[1]:
    Year    Period  Amount
0   2010    1       10
1   2010    2       5
2   2010    4       6
3   2010    5       9
4   2011    1       10
5   2011    3       5
6   2011    4       3

2。创建一个函数以添加符合条件的行

在此期间的默认值是6,您可以将其更改为所需的任何值。

In [2]:
def add_row(df, periods=6):
    years = df.Year.unique().tolist()
    for year in years:
        for i in range(periods):

            if len(df[(df['Period']==i+1) & (df['Year']==year)])==0:
                """ If the Period for the year doesn't exist, we add a row"""
                df.loc[-1] = [year, i+1, 0]
                df.index = df.index + 1 

    return df.sort_values(by=['Year', 'Period']).reset_index().drop(axis=1, columns=['index'])

3。使用该功能进行更改

In [3]: add_row(df)
Out [3]:
    Year    Period  Amount
0   2010    1   10
1   2010    2   5
2   2010    3   0
3   2010    4   6
4   2010    5   9
5   2010    6   0
6   2011    1   10
7   2011    2   0
8   2011    3   5
9   2011    4   3
10  2011    5   0
11  2011    6   0
In [4]: add_row(df, periods=10)
Out [4]:
    Year    Period  Amount
0   2010    1   10
1   2010    2   5
2   2010    3   0
3   2010    4   6
4   2010    5   9
5   2010    6   0
6   2010    7   0
7   2010    8   0
8   2010    9   0
9   2010    10  0
10  2011    1   10
11  2011    2   0
12  2011    3   5
13  2011    4   3
14  2011    5   0
15  2011    6   0
16  2011    7   0
17  2011    8   0
18  2011    9   0
19  2011    10  0