如何从df中选择列a和b,并将它们保存到新的数据帧df1中?

index  a   b   c
1      2   3   4
2      3   4   5

尝试失败:

df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']

当前回答

您可以使用pandas.DataFrame.filter方法对列进行筛选或重新排序,如下所示:

df1 = df.filter(['a', 'b'])

这在链接方法时也非常有用。

其他回答

从0.21.0开始,在列表中使用.loc或[](其中包含一个或多个缺失的标签)是不推荐使用.reindex的。因此,问题的答案是:

df1 = df.reindex(columns=['b','c'])

在以前的版本中,只要找到至少一个键,就可以使用.loc〔标签列表〕(否则会引发KeyError)。此行为已弃用,现在显示警告消息。建议使用.reindex()。

阅读更多关于索引和选择数据的信息。

也可以使用df.pop():

>>> df = pd.DataFrame([('falcon', 'bird',    389.0),
...                    ('parrot', 'bird',     24.0),
...                    ('lion',   'mammal',   80.5),
...                    ('monkey', 'mammal', np.nan)],
...                   columns=('name', 'class', 'max_speed'))
>>> df
     name   class  max_speed
0  falcon    bird      389.0
1  parrot    bird       24.0
2    lion  mammal       80.5
3  monkey  mammal

>>> df.pop('class')
0      bird
1      bird
2    mammal
3    mammal
Name: class, dtype: object

>>> df
     name  max_speed
0  falcon      389.0
1  parrot       24.0
2    lion       80.5
3  monkey        NaN

请使用df.pop(c)。

def get_slize(dataframe, start_row, end_row, start_col, end_col):
    assert len(dataframe) > end_row and start_row >= 0
    assert len(dataframe.columns) > end_col and start_col >= 0
    list_of_indexes = list(dataframe.columns)[start_col:end_col]
    ans = dataframe.iloc[start_row:end_row][list_of_indexes]
    return ans

只需使用此功能

您可以提供要删除的列的列表,并使用Pandas DataFrame上的drop()函数仅返回所需的列。

只是说说而已

colsToDrop = ['a']
df.drop(colsToDrop, axis=1)

将返回仅包含列b和c的DataFrame。

此处记录了drop方法。

如果要按行索引和列名获取一个元素,可以像df['b'][0]一样执行。这就像你能想象的那样简单。

或者可以使用df.ix[0,'b']-索引和标签的混合用法。

注意:从v0.20开始,ix已被弃用,取而代之的是loc/iloc。