我正在努力抓取一个包含主要和次要列名的表。当我这样做时,表格会同时读取列名和列组,因此列名在数据框中未对齐,如此(简化):
unnamed1 unnamed2 unnamed3 Year Passing Rushing Receiving
2015 NA 200 60 NA NA NA
2014 NA 180 70 NA NA NA
我的挑战在于改变列名,以便'Year'在'2015'上排列等等。问题是,要移位的列数在表与表之间不会保持不变(这只是众多列中的一个)。我的代码目前如下所示:
table1=read_html('http://www.pro-football-reference.com/players/T/TyexWi00.htm')
df=table1[0]
to_shift=len(df.dropna(how='all', axis=1).columns) #Number of empty columns to shift by
df2=df.dropna(how='all',axis=1) #Drop the empty columns
df2.columns=df.columns[-to_shift:] #Shift all columns left by the number i've found
问题是对于没有一个stat的玩家(传递这个简单的例子),在数据帧的中间和右端都有完全空白的列,因此代码转移得太远了。是否有一种干净的方法从右到左计数列,直到一个不完全为空?
非常感谢,我希望我的问题很明确!
答案 0 :(得分:1)
是否有一种干净的方法从右到左计数列,直到一列不完全为空?
from itertools import takewhile
len(df.columns) - len(list(takewhile(lambda col: df[col].isnull().all(), reversed(df.columns)))) - 1
说明:
takewhile
返回列表的所有元素(从前面开始),直到给定条件为False
。当我们在reversed(df.columns)
上调用它时,我们从最后得到所有元素。使用df[col].isnull().all()
,我们可以检查列的所有条目是否为空(a.k.a。nan
)。因此,上面的takewhile
表达式返回完全“空”的列的后缀。通过计算total_length - bad_suffix_length - 1
,我们得到条件不满足的第一个索引。
答案 1 :(得分:0)
添加Michael Hoff的正确回复(非常感谢!),代码已被编辑为
to_shift=len(df.columns) - len(list(takewhile(lambda col: df[col].isnull().all(), reversed(df.columns)))) #Index of origianl dataframe to keep
df2=df.drop(list(takewhile(lambda col: df[col].isnull().all(), reversed(df.columns))),axis=1) #Drop the empty right side columns
colnames=df.columns[-to_shift:]
df2.columns=colnames