如何从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']

当前回答

你可以使用熊猫。

我创建DataFrame:

import pandas as pd
df = pd.DataFrame([[1, 2,5], [5,4, 5], [7,7, 8], [7,6,9]],
                  index=['Jane', 'Peter','Alex','Ann'],
                  columns=['Test_1', 'Test_2', 'Test_3'])

数据帧:

       Test_1  Test_2  Test_3
Jane        1       2       5
Peter       5       4       5
Alex        7       7       8
Ann         7       6       9

要按名称选择一个或多个列,请执行以下操作:

df[['Test_1', 'Test_3']]

       Test_1  Test_3
Jane        1       5
Peter       5       5
Alex        7       8
Ann         7       9

您还可以使用:

df.Test_2

然后得到Test_2列:

Jane     2
Peter    4
Alex     7
Ann      6

您还可以使用.loc()从这些行中选择列和行。这称为“切片”。请注意,我从列Test_1到Test_3:

df.loc[:, 'Test_1':'Test_3']

“切片”是:

       Test_1  Test_2  Test_3
Jane        1       2       5
Peter       5       4       5
Alex        7       7       8
Ann         7       6       9

如果你只想让Peter和Ann在Test_1和Test_3列中:

df.loc[['Peter', 'Ann'], ['Test_1', 'Test_3']]

你得到:

       Test_1  Test_3
Peter       5       5
Ann         7       9

其他回答

若要排除某些列,可以将它们放在列索引中。例如:

   A   B    C     D
0  1  10  100  1000
1  2  20  200  2000

选择除两个以外的所有选项:

df[df.columns.drop(['B', 'D'])]

输出:

   A    C
0  1  100
1  2  200

也可以使用truncate方法选择中间列:

df.truncate(before='B', after='C', axis=1)

输出:

    B    C
0  10  100
1  20  200

列名(字符串)无法按您尝试的方式进行切片。

这里有两个选项。如果您从上下文中知道要分割哪些变量,只需通过将列表传递到__getitem_语法([])中,即可返回这些列的视图。

df1 = df[['a', 'b']]

或者,如果重要的是对它们进行数字索引,而不是按它们的名称进行索引(假设您的代码应该在不知道前两列的名称的情况下自动进行索引),那么您可以改为这样做:

df1 = df.iloc[:, 0:2] # Remember that Python does not slice inclusive of the ending index.

此外,您应该熟悉Pandas对象视图与该对象副本的概念。上述第一个方法将在内存中返回所需子对象(所需切片)的新副本。

然而,有时Pandas中有一些索引约定不这样做,而是给你一个新变量,它只引用与原始对象中的子对象或切片相同的内存块。这将发生在第二种索引方式中,因此您可以使用.copy()方法对其进行修改以获得常规副本。当发生这种情况时,更改您认为的切片对象有时会更改原始对象。时刻注意这一点总是很好的。

df1 = df.iloc[0, 0:2].copy() # To avoid the case where changing df1 also changes df

要使用iloc,您需要知道列位置(或索引)。由于列位置可能会改变,您可以使用iloc和dataframe对象的columns方法的get_loc函数来获取列索引,而不是硬编码索引。

{df.columns.get_loc(c): c for idx, c in enumerate(df.columns)}

现在,您可以使用此字典通过名称和iloc访问列。

我发现这种方法非常有用:

# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]

更多详情请点击此处。

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方法。