如何从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']
如何从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']
当前回答
列名(字符串)无法按您尝试的方式进行切片。
这里有两个选项。如果您从上下文中知道要分割哪些变量,只需通过将列表传递到__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访问列。
其他回答
列名(字符串)无法按您尝试的方式进行切片。
这里有两个选项。如果您从上下文中知道要分割哪些变量,只需通过将列表传递到__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访问列。
您可以使用pandas.DataFrame.filter方法对列进行筛选或重新排序,如下所示:
df1 = df.filter(['a', 'b'])
这在链接方法时也非常有用。
我发现这种方法非常有用:
# iloc[row slicing, column slicing]
surveys_df.iloc [0:3, 1:4]
更多详情请点击此处。
要选择多个列,请提取并查看它们:df是先前命名的数据帧。然后创建一个新的数据帧df1,并选择要提取和查看的列a到D。
df1 = pd.DataFrame(data_frame, columns=['Column A', 'Column B', 'Column C', 'Column D'])
df1
将显示所有必需的列!
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
只需使用此功能