首页 > 解决方案 > 为什么将数据框传递给 list.extend() 会导致仅列名存储在列表中?

问题描述

我需要存储在字典中的几个数据框的列名列表。事实证明,我不小心得到了想要的结果,但我认为代码会以不同的方式工作。有人可以解释为什么这段代码有效吗?

最初的想法:遍历字典键,将值(数据帧)添加到目标列表->获取数据帧列表-> [以某种方式]从数据帧中提取列名。

什么有效:遍历字典键,将值(数据帧)添加到目标列表->获取数据帧列名列表,无需进一步。

list1 = []
list2 = []
list3 = []

for key in dfDict.keys(): 
# each dfDict key has a value tuple of 3 dataframes --> key: (df1,df2,df3)
    list1.extend(dfDict[key][0]) # for df1
    list2.extend(dfDict[key][1]) # for df2
    list3.extend(dfDict[key][2]) # for df3

预期的:

list1 = [df1]
list2 = [df2]
list3 = [df3]

实际的:

list1 = [df1.columns]
list2 = [df2.columns]
list3 = [df3.columns]

太棒了,但为什么呢?

标签: pythonpandaslistdataframe

解决方案


list.extend迭代其参数,并DataFrame.__iter__迭代数据框的列名。没有更多的了。

df = pd.DataFrame([], columns=['a', 'b'])    
print([col_name for col_name in df])

输出

['a', 'b']


这有点类似于dict.__iter__迭代键。

df[col] for col in df

行为“相同”

dict[key] for key in dict

无论哪种方式,您都应该使用append(如上所示,您不必显式使用.keys

for key in dfDict:
    list1.append(dfDict[key][0])
    list2.append(dfDict[key][1])
    list3.append(dfDict[key][2])

推荐阅读