繁体   English   中英

切片带有列子集的数据框

[英]Slicing dataframe with subset of columns

我是python的初学者,尝试设置仅包含一部分列(切片?)的dataframe实例,并有两种方法,我认为这两种方法均应工作,但似乎只有一种方法可以工作,并试图理解原因。 Method1有效,但method2返回错误KeyError:('Name','Cost')method1:

import pandas as pd
purchase_1 = pd.Series({'Name': 'Chris',
                        'Item Purchased': 'Dog Food',
                        'Cost': 22.50})
purchase_2 = pd.Series({'Name': 'Kevyn',
                        'Item Purchased': 'Kitty Litter',
                        'Cost': 2.50})
purchase_3 = pd.Series({'Name': 'Vinod',
                        'Item Purchased': 'Bird Seed',
                        'Cost': 5.00})

df = pd.DataFrame([purchase_1, purchase_2, purchase_3], index=['Store 1', 'Store 1', 'Store 2'])
columns_to_keep = ['Name','Cost']
df = df[columns_to_keep]

方法2:

import pandas as pd
purchase_1 = pd.Series({'Name': 'Chris',
                        'Item Purchased': 'Dog Food',
                        'Cost': 22.50})
purchase_2 = pd.Series({'Name': 'Kevyn',
                        'Item Purchased': 'Kitty Litter',
                        'Cost': 2.50})
purchase_3 = pd.Series({'Name': 'Vinod',
                        'Item Purchased': 'Bird Seed',
                        'Cost': 5.00})

df = pd.DataFrame([purchase_1, purchase_2, purchase_3], index=['Store 1', 'Store 1', 'Store 2'])
columns_to_keep = ['Name','Cost']
df = df['Name','Cost']

据我所知,两者似乎都使用列列表设置了实例df。 想了解为什么method2不起作用?

这就是numpy / pandas 中高级索引切片的工作方式。

当选择对象obj 是非元组序列对象,ndarray(数据类型为整数或布尔值)或具有至少一个序列对象或ndarray(数据类型为整数或布尔值)的元组时,将触发高级索引

请注意,在方法2中, df = df['Name','Cost']df = df[('Name','Cost')] -这意味着使用元组作为选择对象; 称为基本索引。

在Python中, x[(exp1, exp2, ..., expN)]等效于x[exp1, exp2, ..., expN] ; 后者只是前者的语法糖。

您需要将列放入数组列表中 (如您的方法1中一样),而不是将其放入一个元组才能触发高级索引,该索引将同时从多个列中选择项目:

>>> df = df[['Name','Cost']] # also df[np.array(['Name','Cost'])] works
>>> df
          Name  Cost
Store 1  Chris  22.5
Store 1  Kevyn   2.5
Store 2  Vinod   5.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM