当前位置: 首页 > 面试题库 >

如何用pythonic方式填充Pandas数据框的丢失记录?

邓高韵
2023-03-14
问题内容

我有一个像这样的熊猫数据框“ 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

有python方式可以做到这一点吗?


问题答案:

您需要构造完整索引,然后使用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月)

只是必须自己重新审视一下……在当前版本的熊猫中,有一个函数可以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

我认为这很优雅。



 类似资料:
  • 问题内容: 创建给定大小的零填充熊猫数据框的最佳方法是什么? 我用过了: 有更好的方法吗? 问题答案: 您可以尝试以下方法:

  • 问题内容: 我是PyQt的新手,正在努力填充QTableView控件。 我的代码如下: 实际上,在代码中,我成功地填充了QListView,但是未显示我设置为QTableView的值,您还可以看到我将行截断为10,因为它永远需要显示数据帧的数百行。 那么,从熊猫数据框中填充表模型的最快方法是什么? 提前致谢。 问题答案: 就我个人而言,我将创建自己的模型类以使其处理起来更加容易。 例如:

  • 问题内容: 这是我正在运行的代码的一个简单示例,我希望将结果放入pandas数据框中(除非有更好的选择): 使用此代码: 我可以得到: 这是一个1x3的数据帧,我理解 为什么 它只有一行,但是我不知道如何使列以正确的顺序变为多行。理想情况下,该解决方案将能够处理 n 行(基于p),并且如果列数由请求的统计数来设置,那将是很棒的(尽管不是必须的)。有什么建议?提前致谢! 问题答案: 使用列表理解尝试

  • 问题内容: 我一直在尝试使用从数据库查询的数据加载TableView,但似乎无法使其正常工作。 这是我第一次尝试用数据库查询项填充数据库的情况,以防我的代码看起来杂乱无章,而且效果不佳。 FXML是通过JavaFx SceneBuilder完成的。 这是数据库查询类: 这是通过JavaFx场景生成器生成的FXML脚本: 问题答案: 这是将数据从数据库填充到tableView的最佳解决方案。 这是参

  • 问题内容: 假设我有一个给定的时间范围。为了进行说明,让我们考虑一些简单的事情,例如2018年全年。我想从ClickHouse查询数据作为每个季度的总和,因此结果应为4行。 问题是我只有两个季度的数据,因此使用时,仅返回两行。 2018-01-011546210800 这将返回: 我需要: 这是简化的示例,但是在实际使用情况下,聚合将是例如。5分钟而不是四分之一,GROUP BY将至少具有一个以上