大熊猫中[]和[[]]的区别是什么?

时间:2015-11-19 19:56:44

标签: python pandas

我对pandas中索引列的结果感到困惑。

两个

db['varname']

db[['varname']]

给我'varname'的列值。但是看起来有一些细微的差别,因为db['varname']的输出显示了值的类型。

4 个答案:

答案 0 :(得分:6)

第一个在您的df(特定列)中查找特定Key,第二个是从您的df中进行子选择的列列表,因此它返回与列表中的值匹配的所有列。

另一个微妙的事情是,第一个默认情况下将返回Series个对象,而第二个返回DataFrame即使您传递包含单个项目的列表

示例:

In [2]:
df = pd.DataFrame(columns=['VarName','Another','me too'])
df

Out[2]:
Empty DataFrame
Columns: [VarName, Another, me too]
Index: []

In [3]:    
print(type(df['VarName']))
print(type(df[['VarName']]))

<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>

所以当你传递一个列表然后它会尝试匹配所有元素:

In [4]:
df[['VarName','Another']]

Out[4]:
Empty DataFrame
Columns: [VarName, Another]
Index: []

但如果没有额外的[],则会引发KeyError

df['VarName','Another']

KeyError: ('VarName', 'Another')

因为您正在尝试查找名为'VarName','Another'且不存在的列

答案 1 :(得分:2)

这几乎是另一个人的骗局,我从它那里得到了这个答案:https://stackoverflow.com/a/45201532/1331446,归功于@SethMMorton。

在这里回答,因为这是 Google 上的热门话题,我花了很长时间才“明白”这个。

Pandas 根本没有 [[ 运算符

当您看到 df[['col_name']] 时,您真的看到了:

col_names = ['col_name']
df[col_names]

因此,[[ 为您做的唯一件事是它使 结果是数据帧,而不是系列。

DataFrame 上的

[ 查看参数的类型;如果是标量,那么您只需要一列,并将其作为系列返回;如果它是一个列表,那么您必须在一组列之后,因此它会返回一个 DataFrame(只有这些列)。

就是这样!

答案 2 :(得分:0)

正如@EdChum指出的那样,[]将返回pandas.core.series.Series,而[[]]将返回pandas.core.frame.DataFrame

两者都是pandas中不同的数据结构。

答案 3 :(得分:0)

对于sklearn,最好使用具有二维形状的db[['varname']]

例如:

from sklearn.preprocessing import  KBinsDiscretizer kbinsDiscretizer  

est = KBinsDiscretizer(n_bins=3, encode='onehot-dense', strategy='uniform') 
est.fit(db[['varname']]) # where use dfb['varname'] causes error