我有pandas.DataFrame
:wordvecs_df
,其中的列标有'word'
,'count'
,'v1'
到'v50'
和'norm1'
按此顺序通过'norm50'
。我想创建一个新的pandas df,只包含'word'
,'count'
和norm1-norm50
的列。
wordvecs_df.loc[:,"norm1":"norm50"]
让我norm1
- norm50
,但是如果我尝试输入单词和计数,我会得到一个IndexingError:索引器太多了。
我无法弄清楚如何从数据框中获取我想要的列。有什么想法吗?
答案 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.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