切片熊猫数据框以获取不连续的列

Posted

技术标签:

【中文标题】切片熊猫数据框以获取不连续的列【英文标题】: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。

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

【问题讨论】:

【参考方案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]

【讨论】:

以上是关于切片熊猫数据框以获取不连续的列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫(python):如何将列添加到数据框以进行索引?

对唯一顺序索引的多索引熊猫数据框进行切片和赋值

如何在熊猫 DataFrame 中对连续值进行分组

按名称切片数据框的列[重复]

如何从 ByteBuffer 中获取连续切片?

Python - 计算熊猫行字符串上的连续前导数字而不计算非连续数字