我有一个学校俱乐部的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新手,因此这可能是解决似乎很常见的问题的最愚蠢的方式,但我一直无法找到可行的方法。如果有更清洁的方法,我完全不愿意采用上述方法。感谢帮助。
答案 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个元素时该怎么做。