切片pandas数据帧以获取不连续的列

时间:2018-02-04 22:32:16

标签: python pandas dataframe slice

我有pandas.DataFramewordvecs_df,其中的列标有'word''count''v1''v50''norm1'按此顺序通过'norm50'。我想创建一个新的pandas df,只包含'word''count'norm1-norm50的列。

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

让我norm1 - norm50,但是如果我尝试输入单词和计数,我会得到一个IndexingError:索引器太多了。

我无法弄清楚如何从数据框中获取我想要的列。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您可以建立列名列表,如:

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

答案 1 :(得分:2)

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

E.g:

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]

答案 2 :(得分:0)

您可以使用pd.concat:

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

答案 3 :(得分:0)

<强>设置
让我们使用一个较小的例子

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