如何将格式错误的Excel文件转换为熊猫数据框

时间:2019-01-14 17:14:30

标签: python

我有一个学校俱乐部的excel文件,结构非常糟糕。看起来像这样:

ClubName    ClubID  DateFormed  Participant1    Participant2    Participant..100  
Band    123 1/1/2016    "Student ID: abc\nClub Officer: President\nStudent Name: John Smith" "Student ID: def\nStudent Name: Joe Doe"   "Student ID: ghi\nStudent Name: Sarah Jones"  
Drama   456 3/4/2015    "Student ID: xyz\nStudent Name: Mary Young" "Student ID: ghi\nClub Officer: Director\nStudent Name: Sarah Jones"    

我想将其展平并放在两个单独的数据框中,以便我可以回答有关数据的一些基本问题。我正在尝试达到两个这样的数据帧:

俱乐部名称俱乐部ID日期已形成

和:

ClubID ParticipantStudentID ParticipantClubOfficer ParticipantStudentName

第一个很简单,但是第二个我很挣扎。我很确定我使这种方式过于复杂,但是我尝试了以下方法:

#read in data
df = pd.read_excel(studentclubs.xlsx)

#get all the columns with participant data
participant_cols = [col for col in df if col.startswith('Participant')]

#add the ClubID
particpant_cols.append('ClubID')

#make a df with just participant information
participants_df = df[participant_cols]

#convert it to a dictionary
data = participants_df._to_dict('records')

#iterate over my dictionary to get a list out of each excel cell
result= []  
for line in data:  
    for key in line:  
        if type(line[key]) == str:  
           result.append((line['ClubID'], line[key]))    

结果如下:

[('123', 'Student ID: abc\nClub Officer: President\nStudent Name: John Smith')
 ('123', 'Student ID: def\nStudent Name: John Doe')]

问题是,当我尝试将学生信息块转换为字典时:

my_dict = {}

for x in result:
    y = x[1].split('\n')
    for a in y:
        a_split = a.split(':')
        my_dict[a_split[0]] = a_split[1].strip

给我错误IndexError:列表索引超出范围

我是python新手,因此这可能是解决似乎很常见的问题的最愚蠢的方式,但我一直无法找到可行的方法。如果有更清洁的方法,我完全不愿意采用上述方法。感谢帮助。

1 个答案:

答案 0 :(得分:0)

您提供的代码可以正常运行。错误IndexError: list index out of range可以在此处y = x[1].split('\n')没有第二个元素的地方x,或者在这里a_split[1].strip不包含{{1}的地方a的地方},所以:有一个元素。

为避免错误,您需要检查a.split(':')len中的y并决定当它们只有1个元素时该怎么做。