在python熊猫中的数据框上进行分组时,如何保留具有空(nan)单元格的行

时间:2019-12-12 03:33:29

标签: python pandas dataframe

我有一个数据帧,其中包含四列:[“ 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”变成空字符串或其他东西来对数据进行一些预处理?

3 个答案:

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