切片熊猫数据框以获取不连续的列
Posted
技术标签:
【中文标题】切片熊猫数据框以获取不连续的列【英文标题】:slice pandas dataframe to get noncontiguous columns 【发布时间】:2018-07-14 18:48:50 【问题描述】:我有一个pandas.DataFrame
:wordvecs_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.join
或pd.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]
【讨论】:
以上是关于切片熊猫数据框以获取不连续的列的主要内容,如果未能解决你的问题,请参考以下文章