我有一个像这样的Pandas数据帧'df':
X Y
IX1 IX2
A A1 20 30
A2 20 30
A5 20 30
B B2 20 30
B4 20 30
它丢失了一些行,我想填写中间的空隙,如下所示:
X Y
IX1 IX2
A A1 20 30
A2 20 30
A3 NaN NaN
A4 NaN NaN
A5 20 30
B B2 20 30
B3 NaN NaN
B4 20 30
有没有pythonic方法来做到这一点?
答案 0 :(得分:12)
您需要构建完整索引,然后使用数据框的reindex
方法。像这样......
import pandas
import StringIO
datastring = StringIO.StringIO("""\
C1,C2,C3,C4
A,A1,20,30
A,A2,20,30
A,A5,20,30
B,B2,20,30
B,B4,20,30""")
dataframe = pandas.read_csv(datastring, index_col=['C1', 'C2'])
full_index = [('A', 'A1'), ('A', 'A2'), ('A', 'A3'),
('A', 'A4'), ('A', 'A5'), ('B', 'B1'),
('B', 'B2'), ('B', 'B3'), ('B', 'B4')]
new_df = dataframe.reindex(full_index)
new_df
C3 C4
A A1 20 30
A2 20 30
A3 NaN NaN
A4 NaN NaN
A5 20 30
B B1 NaN NaN
B2 20 30
B3 20 30
B4 20 30
然后您可以使用fillna
方法将NaN设置为您想要的任何内容。
我不得不重新审视这个......
在当前版本的pandas中,有一个函数可以从可迭代的笛卡尔积中构建MultiIndex
。所以上面的解决方案可能会成为:
datastring = StringIO.StringIO("""\
C1,C2,C3,C4
A,1,20,30
A,2,20,30
A,5,20,30
B,2,20,30
B,4,20,30""")
dataframe = pandas.read_csv(datastring, index_col=['C1', 'C2'])
full_index = pandas.MultiIndex.from_product([('A', 'B'), range(6)], names=['C1', 'C2'])
new_df = dataframe.reindex(full_index)
new_df
C3 C4
C1 C2
A 1 20 30
2 20 30
3 NaN NaN
4 NaN NaN
5 20 30
B 1 NaN NaN
2 20 30
3 20 30
4 20 30
5 NaN NaN
在我看来,非常优雅。