【问题标题】:slice pandas dataframe to get noncontiguous columns切片熊猫数据框以获取不连续的列
【发布时间】:2018-07-14 18:48:50
【问题描述】:

我有一个pandas.DataFramewordvecs_df,列依次标记为'word''count''v1''v50''norm1''norm50'。我想创建一个新的 pandas df,其中只有 'word''count'norm1-norm50 的列。

wordvecs_df.loc[:,"norm1":"norm50"]

让我 norm1-norm50,但如果我尝试输入 word 并计数,我会收到 IndexingError: Too many indexers。

我不知道如何从数据框中获取我想要的列。有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe slice


    【解决方案1】:

    设置
    让我们用一个更小的例子

    i = [0, 1]
    c = range(1, 5)
    wordvecs_df = pd.concat([
        pd.DataFrame(1, i, ['word', 'count']),
        pd.DataFrame(1, i, c).add_prefix('norm'),
        pd.DataFrame(1, i, c).add_prefix('v')
    ], axis=1)
    
    wordvecs_df
    
       word  count  norm1  norm2  norm3  norm4  v1  v2  v3  v4
    0     1      1      1      1      1      1   1   1   1   1
    1     1      1      1      1      1      1   1   1   1   1
    

    解决方案
    使用pd.DataFrame.filter 抓取所有看起来像'norm' 的东西

    wordvecs_df.filter(regex='^norm\d\d?')
    
       norm1  norm2  norm3  norm4
    0      1      1      1      1
    1      1      1      1      1
    

    我们可以通过pd.DataFrame.joinpd.concat 将其添加到我们的其他两列

    wordvecs_df[['word', 'count']].join(
        wordvecs_df.filter(regex='^norm\d\d?'))
    
       word  count  norm1  norm2  norm3  norm4
    0     1      1      1      1      1      1
    1     1      1      1      1      1      1
    

    或者

    pd.concat([
        wordvecs_df[['word', 'count']],
        wordvecs_df.filter(regex='^norm\d\d?')
    ], axis=1)
    
       word  count  norm1  norm2  norm3  norm4
    0     1      1      1      1      1      1
    1     1      1      1      1      1      1
    

    【讨论】:

      【解决方案2】:

      Stephen 的回答效果很好,但是如果列名没有很好的格式,一般的解决方案是获取列位置,构建切片索引,然后使用 iloc 访问。

      例如:

      word_loc = wordvecs_df.columns.get_loc('word')
      count_loc = wordvecs_df.columns.get_loc('count')
      norm1_loc = wordvecs_df.columns.get_loc('norm1')
      norm50_loc = wordvecs_df.columns.get_loc('norm50')
      
      slice = np.r_[word_loc, count_loc, norm1_loc:norm50_loc]
      
      df.iloc[:, slice]
      

      【讨论】:

      • 酷。我以前从未遇到过np.r_
      【解决方案3】:

      你可以使用 pd.concat:

      pd.concat([df[['word','count']], df.loc[:,'norm1':'norm50']], 1)
      

      【讨论】:

        【解决方案4】:

        您可以建立一个列名列表,例如:

        columns = ['word', 'count'] + ['norm%d' % i for i in range(1, 51)]
        wordvecs_df.loc[:,columns]
        

        【讨论】:

          猜你喜欢
          • 2022-10-14
          • 1970-01-01
          • 2019-05-09
          • 1970-01-01
          • 1970-01-01
          • 2015-08-11
          • 1970-01-01
          • 1970-01-01
          • 2021-12-04
          相关资源
          最近更新 更多