用不同列的不同方法填充pandas缺少的地方

时间:2016-06-15 16:00:47

标签: python pandas

我有一个pandas数据帧df,我希望最终输出数据帧final_df

In [17]: df
Out[17]: 
   Date symbol  cost  prev
0    10      a    30     9
1    10      b    33    10
2    12      a    25     4
3    13      a    29     5

In [18]: final_df
Out[18]: 
   Date symbol  cost  prev
0    10      a  30.0   9.0
1    10      b  33.0  10.0
2    11      a   0.0   9.0
3    11      b   0.0  10.0
4    12      a  25.0   4.0
5    13      a  29.0   5.0
6    14      a   0.0   5.0

In [19]: dates=[10,11,12,13,14]

正如您所看到的那样,我想填写缺少的日期并使用0列填充相应的值cost列,但对于列prev,我想填写它上次日期的价值。由于单个日期可能包含多个symbol,因此我使用pivot_table

如果我使用ffill

In [12]: df.pivot_table(index="Date",columns="symbol").reindex(dates,method="ffill").stack().reset_index()
Out[12]: 
   Date symbol  cost  prev
0    10      a  30.0   9.0
1    10      b  33.0  10.0
2    11      a  30.0   9.0
3    11      b  33.0  10.0
4    12      a  25.0   4.0
5    13      a  29.0   5.0
6    14      a  29.0   5.0

这提供了几乎最终的数据结构(它有7行final_df)除了cost列,它复制以前的数据,但我想要0

所以我尝试使用不同的方法填充不同列的缺失值,但这会产生问题,例如

In [13]: df1=df.pivot_table(index="Date",columns="symbol").reindex(dates)

In [14]: df1["cost"]=df1["cost"].fillna(0)

In [15]: df1["prev"]=df1["prev"].ffill()

In [16]: df1.stack().reset_index()
Out[16]: 
   Date symbol  cost  prev
0    10      a  30.0   9.0
1    10      b  33.0  10.0
2    11      a   0.0   9.0
3    11      b   0.0  10.0
4    12      a  25.0   4.0
5    12      b   0.0  10.0
6    13      a  29.0   5.0
7    13      b   0.0  10.0
8    14      a   0.0   5.0
9    14      b   0.0  10.0

正如您在输出中看到的那样,symbol "b"数据的日期为12,13,14,但我不想这样,因为在初始数据框中没有数据数据{ {1}} symbol表示日期为"b",我希望保持这种方式,并且新日期12,13中不得有14跟随13

那么如何解决这个问题并获得final_df输出?

修改

这是检查程序的另一个例子。

In [17]: df
Out[17]: 
   Date symbol  cost  prev
0    10      a    30     9
1    10      b    33    10
2    14      a    29     5

In [18]: dates=range(10,17)

In [19]: final_df
Out[19]: 
    Date symbol  cost  prev
0     10      a    30     9
1     10      b    33    10
2     11      a     0     9
3     11      b     0    10
4     12      a     0     9
5     12      b     0    10
6     13      a     0     9
7     13      b     0    10
8     14      a    29     5
9     15      a     0     5
10    16      a     0     5

解决方案

我找到了解决这个问题的方法。在这里,我使用一种技巧来跟踪最初pivot_table中缺少的位置并最终删除。

In [44]: df1=df.pivot_table(index="Date",columns='symbol',fill_value="missing").reindex(dates)

In [45]: df1["cost"]= df1["cost"].fillna(0)

In [46]: df1["prev"]=df1["prev"].ffill()

In [47]: df1.stack().replace(to_replace="missing",value=np.nan).dropna().reset_index()
Out[47]: 
    Date symbol  cost  prev
0     10      a  30.0   9.0
1     10      b  33.0  10.0
2     11      a   0.0   9.0
3     11      b   0.0  10.0
4     12      a   0.0   9.0
5     12      b   0.0  10.0
6     13      a   0.0   9.0
7     13      b   0.0  10.0
8     14      a  29.0   5.0
9     15      a   0.0   5.0
10    16      a   0.0   5.0

0 个答案:

没有答案