【发布时间】:2015-12-14 12:45:35
【问题描述】:
假设我有一个数据框。具有多列(例如“A”、“B”) 使用以下代码,我想仅基于一列创建一个新的数据框:
df2 = df1['A']
但是,当我这样做时,数据框突然转换为 TimeSeries
In [5] print type (df2)<class 'pandas.core.series.Series'>
非常非常奇怪...谁能向我解释为什么会发生这种情况...?
【问题讨论】:
假设我有一个数据框。具有多列(例如“A”、“B”) 使用以下代码,我想仅基于一列创建一个新的数据框:
df2 = df1['A']
但是,当我这样做时,数据框突然转换为 TimeSeries
In [5] print type (df2)<class 'pandas.core.series.Series'>
非常非常奇怪...谁能向我解释为什么会发生这种情况...?
【问题讨论】:
df1['A'] 返回一个系列。 df1[['A']] 返回一个 DataFrame。
切片的行为会有所不同,具体取决于您在 括号。
如果您使用字符串对 DataFramedf 进行切片,DataFrame 会尝试找到
df.columns 中的字符串,如果成功,则将列作为系列返回。
如果您使用(字符串)列表对 df 进行切片,则 DataFrame 会尝试查找
df.columns 中的每个字符串,如果成功,则将列作为
新的数据框。如果列表恰好只包含一个字符串,那么您会得到一个
只有一列的 DataFrame。
在作业中使用切片时,df['B'] = xyz 调用
df.__setitem__('B', xyz)。 DataFrame 的__setitem__ 被实现为
修改df 本身。赋值不会返回值,但会修改
df 到位。
在表达式中使用切片时,df[xyz] 调用
df.__getitem__(xyz)。 DataFrame 的 __getitem__ 方法返回不同的
对象类型取决于xyz 的类型。
【讨论】:
'df2['B']' = df2['B'] 在已经现有 数据框中分配一个新列。在那种情况下,数据框仍然是一个数据框。但是当使用上述语法将值分配给新变量时,它会自动转换为 Series...
df2['B'] = xyz 会调用 df2.__setitem__('B', xyz)。 DataFrame 的__setitem__ 被实现来修改df2 本身。赋值不返回值,但它确实修改了df2。在 表达式 中使用切片时,df2[xyz] 调用 df2.__getitem__(xyz)。 DataFrame 的__getitem__ 方法根据xyz 的类型返回不同类型的对象。
是的,df1['A'] 是 Pandas 系列,因此将其分配给 df2 将产生 pandas 系列。
pandas.DataFrame(df.A) - 将创建一个新的 pandas 数据框
【讨论】: