【问题标题】:Drop row in Pandas Series and clean up index在 Pandas Series 中删除行并清理索引
【发布时间】:2013-01-07 09:29:34
【问题描述】:

我有一个 Pandas 系列,我想根据一个随机数选择一行(在下面的代码示例中为 5)并删除该行。当该行被删除时,我想为剩余的行(0 到 8)创建一个新索引。下面的代码:

print 'Original series: ', sample_mean_series
print 'Length of original series', len(sample_mean_series)
sample_mean_series = sample_mean_series.drop([5],axis=0)
print 'Series with item 5 dropped: ', sample_mean_series
print 'Length of modified series:', len(sample_mean_series)
print sample_mean_series.reindex(range(len(sample_mean_series)))

这是输出:

Original series:  
0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
5   -0.000051
6    0.000125
7   -0.000108
8   -0.000009
9   -0.000052
Length of original series 10
Series with item 5 dropped:  
0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
6    0.000125
7   -0.000108
8   -0.000009
9   -0.000052
Length of modified series: 9
0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
5         NaN
6    0.000125
7   -0.000108
8   -0.000009

我的问题是第 8 行被删除了。我想删除行“5 NaN”并保持 -0.000052 的索引为 0 到 8。这就是我希望它的样子:

0    0.000074
1   -0.000067
2    0.000076
3   -0.000017
4   -0.000038
5    0.000125
6   -0.000108
7   -0.000009
8   -0.000052

【问题讨论】:

    标签: python pandas series


    【解决方案1】:

    有点令人困惑的是,reindex 并不意味着“创建新索引”。要创建新索引,只需分配给index 属性。因此,在您的最后一步只需执行sample_mean_series.index = range(len(sample_mean_series))

    【讨论】:

    • 感谢您简洁明了的回答!但是,我对 Ahlden 的例子中发生的事情感到困惑。重新索引是否在说“创建一个索引中没有间隙的新系列,其中任何缺失的索引都用 NaN 值填充”?似乎这就是正在发生的事情,但这似乎很疯狂。另外,如果索引是 a, b, c, e 而不是 0, 1, 2, 4 ,这会起作用吗?
    • @MikeWilliamson:是的,基本上就是这样。使用reindex[blah] 只是选择行,基本上就像做df.ix[blah] 一样,如果你要求的那些不存在,它会给你NaN。它确实有一些填充 NaN 的选项,但我从来没有真正理解重新索引的意义,更不用说它的名字了。
    • 实际上,有一个 reset_index 方法可以自动为您的行编号。
    【解决方案2】:

    这是一个单行:

    In [1]: s
    Out[1]:
    0   -0.942184
    1    0.397485
    2   -0.656745
    3    1.415797
    4    1.123858
    5   -1.890870
    6    0.401715
    7   -0.193306
    8   -1.018140
    9    0.262998
    

    我使用Series.drop 方法删除第5 行,然后使用reset_index 将索引重新编号为连续的。如果不使用reset_index,索引会从 4 跳到 6 而没有 5。

    默认情况下,reset_index 会将原始索引移动到DataFrame 中,并将其与系列值一起返回。传递drop=True 可以防止这种情况发生。

    In [2]: s2 = s.drop([5]).reset_index(drop=True)
    
    In [3]: s2
    Out[3]:
    0   -0.942184
    1    0.397485
    2   -0.656745
    3    1.415797
    4    1.123858
    5    0.401715
    6   -0.193306
    7   -1.018140
    8    0.262998
    Name: 0
    

    【讨论】:

    • 你能解释一下你的答案吗?
    • 我解释了我的答案并将其更新为更清晰。
    【解决方案3】:

    要删除 dataframe 中的行并清理索引:

    b = df['amount'] > 10000
    df_dropped = df.drop(df[~b].index).reset_index()
    

    【讨论】:

      【解决方案4】:
      df.reset_index(drop=True, inplace = True)
      

      会做你想做的事。

      重置索引时,旧索引作为列添加,并使用新的顺序索引。您可以使用 drop 参数来避免将旧索引添加为列。

      【讨论】:

      • 请记住,这个问题是从 2013 年开始的。.. 亿万年前的编程,所以如果你想让你的答案有意义,请添加一些版本号并参考库中的“超时”更改等. 审查结束。
      猜你喜欢
      • 2017-05-07
      • 1970-01-01
      • 2016-02-28
      • 2021-11-24
      • 2023-01-25
      • 2012-10-13
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多