我对pandas中索引列的结果感到困惑。
两个
db['varname']
和
db[['varname']]
给我'varname'的列值。但是看起来有一些细微的差别,因为db['varname']
的输出显示了值的类型。
答案 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(只有这些列)。
就是这样!
答案 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