Alb*_*ndo 45 python indexing dataframe pandas
即:
import pandas
d = {'col1': 2, 'col2': 2.5}
df = pandas.DataFrame(data=d, index=[0])
print(df['col2'])
print(df.col2)
Run Code Online (Sandbox Code Playgroud)
输出是一样的.
这个答案是否适用于这种情况?
Jul*_*rec 41
"点符号",即为方便起见而公开df.col2的属性访问.
您可以直接将Panel上的索引,DataFrame上的列和Panel上的项目作为属性访问:
df['col2']做同样的事情:它返回pd.Series列的一个.
关于属性访问的一些注意事项:
df.new_col = x不会工作,更糟糕的是:它会默默地实际创建一个新属性而不是列 - 想想猴子修补这里)YaO*_*OzI 20
差异的简短回答:
[]索引(方括号访问)具有对 DataFrame 列数据进行操作的完整功能。多解释一下,Seires和DataFrame是pandas中的核心类和数据结构,当然它们也是Python类,所以在涉及pandas DataFrame和普通Python对象之间的属性访问时,会有一些细微的区别。但它有据可查,很容易理解。只需注意几点:
在 Python 中,用户可以使用属性访问将自己的数据属性动态添加到实例对象中。
>>> class Dog(object):
... pass
>>> dog = Dog()
>>> vars(dog)
{}
>>> superdog = Dog()
>>> vars(superdog)
{}
>>> dog.legs = 'I can run.'
>>> superdog.wings = 'I can fly.'
>>> vars(dog)
{'legs': 'I can run.'}
>>> vars(superdog)
{'wings': 'I can fly.'}
Run Code Online (Sandbox Code Playgroud)在熊猫,索引和列密切相关的数据结构,您可以访问在数据帧上的系列指数,列作为属性。
>>> import pandas as pd
>>> import numpy as np
>>> data = np.random.randint(low=0, high=10, size=(2,2))
>>> df = pd.DataFrame(data, columns=['a', 'b'])
>>> df
a b
0 7 6
1 5 8
>>> vars(df)
{'_is_copy': None,
'_data': BlockManager
Items: Index(['a', 'b'], dtype='object')
Axis 1: RangeIndex(start=0, stop=2, step=1)
IntBlock: slice(0, 2, 1), 2 x 2, dtype: int64,
'_item_cache': {}}
Run Code Online (Sandbox Code Playgroud)但是,pandas 属性访问主要是方便读取和修改数据帧的系列或列的现有元素。
>>> df.a
0 7
1 5
Name: a, dtype: int64
>>> df.b = [1, 1]
>>> df
a b
0 7 1
1 5 1
Run Code Online (Sandbox Code Playgroud)而且,便利性是对完整功能的权衡。例如,您可以使用列名称创建一个 DataFrame 对象['space bar', '1', 'loc', 'min', 'index'],但您不能将它们作为属性访问,因为它们不是有效的 Python 标识符1,space bar或者与现有方法名称冲突。
>>> data = np.random.randint(0, 10, size=(2, 5))
>>> df_special_col_names = pd.DataFrame(data, columns=['space bar', '1', 'loc', 'min', 'index'])
>>> df_special_col_names
space bar 1 loc min index
0 4 4 4 8 9
1 3 0 1 2 3
Run Code Online (Sandbox Code Playgroud)在这些情况下,.loc,.iloc和[]索引是完全访问/操作 Series 和 DataFrame 对象的索引和列的定义方式。
>>> df_special_col_names['space bar']
0 4
1 3
Name: space bar, dtype: int64
>>> df_special_col_names.loc[:, 'min']
0 8
1 2
Name: min, dtype: int64
>>> df_special_col_names.iloc[:, 1]
0 4
1 0
Name: 1, dtype: int64
Run Code Online (Sandbox Code Playgroud)另一个重要的区别是何时为 DataFrame 创建新列。如您所见,df.c = df.a + df.b刚刚在核心数据结构旁边创建了一个新属性,因此从 version0.21.0和更高版本开始,此行为将引发UserWarning(不再沉默)。
>>> df
a b
0 7 1
1 5 1
>>> df.c = df.a + df.b
__main__:1: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access
>>> df['d'] = df.a + df.b
>>> df
a b d
0 7 1 8
1 5 1 6
>>> df.c
0 8
1 6
dtype: int64
>>> vars(df)
{'_is_copy': None,
'_data':
BlockManager
Items: Index(['a', 'b', 'd'], dtype='object')
Axis 1: RangeIndex(start=0, stop=2, step=1)
IntBlock: slice(0, 2, 1), 2 x 2, dtype: int64
IntBlock: slice(2, 3, 1), 1 x 2, dtype: int64,
'_item_cache': {},
'c': 0 8
1 6
dtype: int64}
Run Code Online (Sandbox Code Playgroud)最后,要为 DataFrame 创建一个新列,永远不要使用属性 access,正确的方法是使用[]或.locindexing:
>>> df
a b
0 7 6
1 5 8
>>> df['c'] = df.a + df.b
>>> # OR
>>> df.loc[:, 'c'] = df.a + df.b
>>> df # c is an new added column
a b c
0 7 6 13
1 5 8 13
Run Code Online (Sandbox Code Playgroud)Bre*_*arn 15
只要您使用简单的名称访问单个列,它们就是相同的,但您可以使用括号表示法执行更多操作.您只能df.col在列名称是有效的Python标识符时使用(例如,不包含空格和其他此类内容).此外,如果您的列名与pandas方法名称(如sum)冲突,您可能会遇到意外.使用括号,您可以选择多个列(例如df[['col1', 'col2']])或添加新列(df['newcol'] = ...),这不能通过点访问来完成.
您链接的另一个问题适用,但这是一个更普遍的问题.Python对象可以定义.和[]运算符如何应用于它们.Pandas DataFrames选择使它们在访问单列的有限情况下使它们相同,但需要注意上述注意事项.