我有一个数据框,其中包含有关哪些人参加每个活动的信息。不幸的是,每条信息最多可以放置在多个不同的位置。那一行可以为许多不同的人提供信息。列名称如下:
['Name', 'Activity', 'Name.0', 'Age.0', 'Activity.0', 'Name.1', 'Age.1', 'Activity.1', 'Name.2', 'Age.2', 'Activity.2', 'Name.3', 'Age.3', 'Activity.3', 'Name.4', 'Age.4', 'Activity.4']
对于每个活动,我想列出与该活动相关的所有人员及其年龄(如果提供了该信息)。最终,我想为每个活动制作一张桌子。我怎样才能做到这一点?
感觉我需要首先处理所有。*列名,然后以某种方式对groupby Activity进行处理,但是我不确定该怎么做。
这是一些使用输出的匿名数据df.sample(5).to_dict()
。
{'Activity': {0: 'Audi', 1: 'Carn', 2: 'Pop-', 3: 'Samb', 4: 'Pre-'},
'Activity.0': {0: 'Samb', 1: 'Pre-', 2: 'nan', 3: 'Samb', 4: 'Pre-'},
'Activity.1': {0: 'Samb', 1: 'Audi', 2: 'nan', 3: 'Samb', 4: 'nan'},
'Activity.2': {0: 'Pre-', 1: 'Audi', 2: 'nan', 3: 'nan', 4: 'nan'},
'Activity.3': {0: 'nan', 1: 'Carn', 2: 'nan', 3: 'nan', 4: 'nan'},
'Activity.4': {0: 'nan', 1: 'Carn', 2: 'nan', 3: 'nan', 4: 'nan'},
'Age.0': {0: '18+', 1: 'Under 5', 2: '11', 3: '11', 4: 'Under 5'},
'Age.1': {0: '11', 1: 'Under 5', 2: '11', 3: 17, 4: '18+'},
'Age.2': {0: '11', 1: '18+', 2: 'nan', 3: '18+', 4: 'nan'},
'Age.3': {0: 'Under 5', 1: '18+', 2: 'nan', 3: 'nan', 4: 'nan'},
'Age.4': {0: 'nan', 1: '18+', 2: 'nan', 3: 'nan', 4: 'nan'},
'Name': {0: 'Jess', 1: 'Tama', 2: 'Beki', 3: 'Havi', 4: 'Dror'},
'Name.0': {0: 'Sam ', 1: 'Lila', 2: 'nan', 3: 'Joel', 4: 'Emil'},
'Name.1': {0: 'Zipp', 1: 'Marg', 2: 'nan', 3: 'Solo', 4: 'Ari '},
'Name.2': {0: 'Reub', 1: 'Joan', 2: 'nan', 3: 'Sami', 4: 'nan'},
'Name.3': {0: 'Shev', 1: 'John', 2: 'nan', 3: 'nan', 4: 'nan'},
'Name.4': {0: 'nan', 1: 'Edwa', 2: 'nan', 3: 'nan', 4: 'nan'}}
在此示例中,让我们进行名为“ Audi”的活动。仅有的人是“杰西”(无年龄),“玛格”(5岁以下)和“琼”(18岁以上)。对于活动“ Samb”,与之相关的人是“ Havi”(无年龄),“ Sam”(18岁以上),“ Joel”(11岁),“ Zipp”(11岁)和“ Solo”(17岁)。我希望每个活动都做同样的事情。
这将为您工作:
activities = {}
# function for Activity, Name
def add_details_for_activity(row):
global activities
if pd.notna(row[1]) and pd.notna(row[0]) and row[1] != 'nan' and row[0] != 'nan':
if activities.get(row[0]) is not None:
activities[row[0]].append(row[1])
else:
activities[row[0]] = [row[1]]
# function for Activity.#, Name.#, age.#
def add_details_for_activities(row):
global activities
if pd.notna(row[1]) and pd.notna(row[0]) and row[1] != 'nan' and row[0] != 'nan':
if activities.get(row[0]) is not None:
if pd.notna(row[2]) and row[2] != 'nan':
activities[row[0]].append((row[1], row[2]))
else:
activities[row[0]].append(row[1])
else:
print(row[0])
if pd.notna(row[2]) and row[2] != 'nan':
activities[row[0]] = [(row[1], row[2])]
else:
activities[row[0]] = [row[1]]
df[['Activity', 'Name']].apply(add_details_for_activity, axis = 1)
for i in range(5):
df[['Activity.'+str(i), 'Name.'+str(i), 'Age.'+str(i)]].apply(add_details_for_activities, axis = 1)
样本输出为:
{'Audi': ['Jess', ('Marg', 'Under 5'), ('Joan', '18+')],
'Carn': ['Tama', ('John', '18+'), ('Edwa', '18+')],
'Pop-': ['Beki'],
'Samb': ['Havi',
('Sam ', '18+'),
('Joel', '11'),
('Zipp', '11'),
('Solo', 17)],
'Pre-': ['Dror', ('Lila', 'Under 5'), ('Emil', 'Under 5'), ('Reub', '11')]}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句