【问题标题】:How to fill the missing record of Pandas dataframe in pythonic way?python - 如何以pythonic方式填充Pandas数据框的缺失记录?
【发布时间】:2012-09-05 14:25:21
【问题描述】:

我有一个像这样的 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方法可以做到这一点?

【问题讨论】:

  • 你会怎么做?
  • 作为参考,在 numpy 中有一个叫做 masked array 的东西来处理这样的情况。
  • 我打算使用 'df.reindex(index= index_mask)',但不知道如何有效地构建 'index_mask'

标签: python pandas


【解决方案1】:

您需要构建完整的索引,然后使用数据框的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 设置为您想要的任何值。

更新(2014 年 6 月)

我只好自己重新审视这个...... 在当前版本的 pandas 中,有一个函数可以从 iterables 的笛卡尔积构建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

在我看来,相当优雅。

【讨论】:

  • 我想你可能想要更像这样的东西(对不起,评论不适用于换行符):` import StringIO 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""") df = pd.read_csv(datastring, index_col=['C1 ', 'C2']) display(df) full_index = pd.MultiIndex.from_product([('A', 'B'), range(6)], names=['C1', 'C2']) display( full_index) new_df = df.reindex(full_index) display(new_df)`
  • 很棒的答案。 (range(6) 应该改为 range(6)。
  • 还有一件事:在第二个示例中,您应该将原始数据框中的 C2 列值更改为 [1, 2, 5...] 而不是 [A1, A2, A5... ]。照原样,重新索引会导致 df 充满 NaN。
猜你喜欢
  • 2019-09-23
  • 2019-11-27
  • 2021-06-17
  • 2022-11-02
  • 2018-09-14
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2019-12-13
相关资源
最近更新 更多