我有一个数据帧,其中包含四列:[“ Artist”,“ Album”,“ Title”,“ Point”],其中前三列标识一首歌曲,第四列是乐谱。每首歌曲可能会多次出现在列表中,有些歌曲没有专辑信息,这是相应单元格中的nan值。 我使用以下代码来获取每首歌曲的总分:
B = A.groupby(['Artist', 'Album', 'Title'])['Point'].sum()
C = B.sort_values(by=['Point'], ascending=[False]).reset_index(drop=True)
但是我意识到的是,如果有任何行缺少专辑信息(nan),那么该行就不会出现在变量B中。我如何强制nan是有效的独特信息?如果我有两次相同的歌曲,一次有专辑,一次没有专辑,那么在组合后,这两首歌曲应显示为两个不同的记录。
有没有办法正确地执行它,还是必须通过强制所有“ nan”变成空字符串或其他东西来对数据进行一些预处理?
答案 0 :(得分:1)
.fillna('N / A')将修复搜索。但有了更多数据,可能会有更好的解决方案
A['Album'].fillna('N/A', inplace=True)
您认为应该可以工作
答案 1 :(得分:1)
我建议对您的建议稍作调整。不用将list_entry = {'kind': 'calendar#calendarList', 'etag': '"p328cl9tbhinuc0g"', 'nextSyncToken': 'CJDKp6uMr-YCEhZwZXRlcmNoaWVuODJAZ21haWwuY29t', 'items': [{'kind': 'calendar#calendarListEntry', 'etag': '"1576118870730000"', 'id': 'xxxx@gmail.com', 'summary': 'peterchien82@gmail.com', 'timeZone': 'Asia/Taipei', 'colorId': '18', 'backgroundColor': '#b99aff', 'foregroundColor': '#000000', 'selected': True, 'accessRole': 'owner', 'defaultReminders': [{'method': 'popup', 'minutes': 2}, {'method': 'popup', 'minutes': 30}], 'notificationSettings': {'notifications': [{'type': 'eventCreation', 'method': 'email'}, {'type': 'eventChange', 'method': 'email'}, {'type': 'eventCancellation', 'method': 'email'}]}, 'primary': True, 'conferenceProperties': {'allowedConferenceSolutionTypes': ['eventHangout']}}, {'kind': 'calendar#calendarListEntry', 'etag': '"1567066298066000"', 'id': 'addressbook#contacts@group.v.calendar.google.com', 'summary': 'Contacts', 'timeZone': 'Asia/Taipei', 'summaryOverride': 'Contacts', 'colorId': '17', 'backgroundColor': '#9a9cff', 'foregroundColor': '#000000', 'selected': True, 'accessRole': 'reader', 'defaultReminders': [], 'conferenceProperties': {'allowedConferenceSolutionTypes': ['eventHangout']}}, {'kind': 'calendar#calendarListEntry', 'etag': '"1567066298066000"', 'id': 'en.canadian#holiday@group.v.calendar.google.com', 'summary': 'Holidays in Canada', 'timeZone': 'Asia/Taipei', 'summaryOverride': 'Holidays in Canada', 'colorId': '7', 'backgroundColor': '#42d692', 'foregroundColor': '#000000', 'selected': True, 'accessRole': 'reader', 'defaultReminders': [], 'conferenceProperties': {'allowedConferenceSolutionTypes': ['eventHangout']}}]}
的值转换为空字符串,而是可以将它们替换为NaN
。我给你一个可重复的例子:
Unknown
import pandas as pd
import numpy as np
df = pd.DataFrame({'Height':[20, 50, 20, 15, 10],
'Happy':['No', 'Yes', 'No', 'No', 'Yes'],
'Sex':['M', np.nan, 'M', 'M', 'F']})
print(df)
Height Happy Sex
0 20 No M
1 50 Yes NaN
2 20 No M
3 15 No M
4 10 Yes F
df.fillna('Unknown').groupby(['Sex', 'Happy'])['Height'].sum()
以您的情况,我会尝试:
Out[8]:
Sex Happy
F Yes 10
M No 55
Unknown Yes 50
Name: Height, dtype: int64
答案 2 :(得分:0)
IIUC,您可以这样做。
输入
Artist Album Point
0 AC1 A 1
1 AC2 B 2
2 AC1 NaN 3
3 AC4 A 4
4 AC5 C 5
a = df.groupby(['Artist'])['Album'].ffill()
df.groupby(['Artist', a ])['Point'].sum().reset_index(name='Points')
输出
Artist Album Points
0 AC1 A 4
1 AC2 B 2
2 AC4 A 4
3 AC5 C 5
此代码可能是您可以使用的
df['Album'] = df['Album'].astype(str)
df.groupby(['Artist','Album'])['Point'].sum().reset_index(name='Points')
输出
Artist Album Points
0 AC1 A 1
1 AC1 nan 3
2 AC2 B 2
3 AC4 A 4
4 AC5 C 5