我原以为 Pandas DataFrame 基本上表示为列的集合。也就是说,我认为以下两行代码会产生相同的系列列表(对于某些任意 DataFrame df
):
list1 = [item for item in df]
list2 = [df[col_name] for col_name in df.columns]
但显然它们非常不同;将 df
视为可迭代对象并单步执行它与单步执行 df.columns
完全相同,后者当然只是列名列表:
df = pd.DataFrame({'col_1': [1,2,3,4,5], 'col_2':[5,6,7,8,9]})
for a, b in zip(df, df.columns):
print(a,b, type(a), type(b), a==b)
输出:
col_1 col_1 <class 'str'> <class 'str'> True
col_2 col_2 <class 'str'> <class 'str'> True
这是为什么?这对我来说似乎很不直观。
(需要说明的是:我不是在问如何获取 DataFrame 中的列列表,或者如何遍历 DataFrame 的列。)
当您尝试像这样直接迭代 df 时:
[item for item in df]
您正在调用 df.__iter__() 方法,该方法依次调用 df._info_axis 属性,然后调用 df._info_axis_name 属性,对于 Dataframe 而言,该属性是列名列表。
当您调用 df[col_name] 时,您正在对数据框的列进行切片。
我是一名优秀的程序员,十分优秀!