如何从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']
当前回答
假设你的列名(df.columns)是['index','a','b','c'],那么你想要的数据就在第三列和第四列。如果脚本运行时不知道它们的名称,可以执行以下操作
newdf = df[df.columns[2:4]] # Remember, Python is zero-offset! The "third" entry is at slot two.
正如EMS在回答中所指出的,df.ix对列进行了更简洁的切片,但.columns切片接口可能更自然,因为它使用了普通的一维Python列表索引/切片语法。
警告:“index”是DataFrame列的错误名称。同一标签也用于实际df.index属性,即index数组。因此,您的列由df['index']返回,而真正的DataFrame索引由df.index返回。index是一种特殊的系列,优化用于查找其元素值。对于df.index,它用于按标签查找行。df.columns属性也是一个pd.Index数组,用于按标签查找列。
其他回答
In [39]: df
Out[39]:
index a b c
0 1 2 3 4
1 2 3 4 5
In [40]: df1 = df[['b', 'c']]
In [41]: df1
Out[41]:
b c
0 3 4
1 4 5
您可以使用pandas.DataFrame.filter方法对列进行筛选或重新排序,如下所示:
df1 = df.filter(['a', 'b'])
这在链接方法时也非常有用。
在最新版本的Pandas中,有一种简单的方法可以做到这一点。列名(字符串)可以按您喜欢的方式进行切片。
columns = ['b', 'c']
df1 = pd.DataFrame(df, columns=columns)
你可以使用熊猫。
我创建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
列名(字符串)无法按您尝试的方式进行切片。
这里有两个选项。如果您从上下文中知道要分割哪些变量,只需通过将列表传递到__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访问列。