基于python中的最后一个空列重新格式化数据帧

时间:2016-07-20 19:34:38

标签: python-2.7 pandas

我正在努力抓取一个包含主要和次要列名的表。当我这样做时,表格会同时读取列名和列组,因此列名在数据框中未对齐,如此(简化):

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的玩家(传递这个简单的例子),在数据帧的中间和右端都有完全空白的列,因此代码转移得太远了。是否有一种干净的方法从右到左计数列,直到一个不完全为空?

非常感谢,我希望我的问题很明确!

2 个答案:

答案 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