当前位置: 首页 > 面试题库 >

Pandas在groupby函数中计算空值

柯栋
2023-03-14
问题内容

df = pd.DataFrame({‘A’ : [‘foo’, ‘bar’, ‘foo’, ‘bar’, ‘foo’, ‘bar’, ‘foo’, ‘foo’],
‘B’ : [‘one’, ‘one’, ‘two’, ‘three’, ‘two’, ‘two’, ‘one’, ‘three’],
‘C’ : [np.nan, ‘bla2’, np.nan, ‘bla3’, np.nan, np.nan, np.nan, np.nan]})

输出:

     A      B     C
0  foo    one   NaN
1  bar    one  bla2
2  foo    two   NaN
3  bar  three  bla3
4  foo    two   NaN
5  bar    two   NaN
6  foo    one   NaN
7  foo  three   NaN

我想使用groupby来计算foo的不同组合的NaN数。

预期输出(编辑):

     A      B     C    D
0  foo    one   NaN    2
1  bar    one  bla2    0
2  foo    two   NaN    2
3  bar  three  bla3    0
4  foo    two   NaN    2
5  bar    two   NaN    1
6  foo    one   NaN    2
7  foo  three   NaN    1

目前,我正在尝试:

df['count']=df.groupby(['A'])['B'].isnull().transform('sum')

但这不起作用…

谢谢


问题答案:

我认为你需要groupby使用sumNaN值:

df2 = df.C.isnull().groupby([df['A'],df['B']]).sum().astype(int).reset_index(name='count')
print (df2)
     A      B  count
0  bar    one      0
1  bar  three      0
2  bar    two      1
3  foo    one      2
4  foo  three      1
5  foo    two      2

如果需要过滤器,首先添加boolean indexing

df = df[df['A'] == 'foo']
df2 = df.C.isnull().groupby([df['A'],df['B']]).sum().astype(int)
print (df2)
A    B    
foo  one      2
     three    1
     two      2

或更简单:

df = df[df['A'] == 'foo']
df2 = df['B'].value_counts()
print (df2)
one      2
two      2
three    1
Name: B, dtype: int64

编辑:解决方案非常相似,只添加transform

df['D'] = df.C.isnull().groupby([df['A'],df['B']]).transform('sum').astype(int)
print (df)
     A      B     C  D
0  foo    one   NaN  2
1  bar    one  bla2  0
2  foo    two   NaN  2
3  bar  three  bla3  0
4  foo    two   NaN  2
5  bar    two   NaN  1
6  foo    one   NaN  2
7  foo  three   NaN  1

类似的解决方案:

df['D'] = df.C.isnull()
df['D'] = df.groupby(['A','B'])['D'].transform('sum').astype(int)
print (df)
     A      B     C  D
0  foo    one   NaN  2
1  bar    one  bla2  0
2  foo    two   NaN  2
3  bar  three  bla3  0
4  foo    two   NaN  2
5  bar    two   NaN  1
6  foo    one   NaN  2
7  foo  three   NaN  1


 类似资料:
  • 问题内容: 我有以下形式的数据: 组内的非空值始终相同。我想对每个组(如果存在)的非空值进行一次计数,然后找到每个值的总数。 我目前正在以以下方式(笨拙和低效)进行此操作: 我敢肯定,有一种方法可以更干净地执行此操作,而无需使用循环,但是我似乎无法解决问题。任何帮助将非常感激。 问题答案: 我认为您可以使用: 的另一种解决方案,然后创建new by ,将其重塑为by和last :

  • 本文向大家介绍pandas数据分组groupby()和统计函数agg()的使用,包括了pandas数据分组groupby()和统计函数agg()的使用的使用技巧和注意事项,需要的朋友参考一下 数据分组 使用 groupby() 方法进行分组 group.size()查看分组后每组的数量 group.groups 查看分组情况 group.get_group('名字') 根据分组后的名字选择分组数据

  • 问题内容: 我想计算一个分组的pandas dataframe列中字符串的出现。 假设我有以下数据框: 首先,我想GROUP BY和。对于这些组中的每一个,我都希望计算该列中的出现次数。 结果应如下所示: 通过两列进行分组很容易: 但是接下来呢? 问题答案: 调用对象的“得分”列,并使用vectorise方法,使用此方法过滤和调用: 要将其分配为列使用,以便聚合返回其索引与原始df对齐的序列:

  • 问题内容: 我有一个数据框,并且我试图向其添加一列顺序差异。我发现了一种我非常喜欢的方法(并且对于我的用例而言,它具有很好的概括性)。但是我一路上注意到一件奇怪的事。你能帮我弄清楚吗? 以下是一些具有正确结构的数据: 好,很好。这给了我这样的框架: 我的目标是向此数据框添加一个新列,其中将包含顺序更改。数据需要这样做,但是排序和差异需要“逐行代码”完成,以便另一个代码中的间隔不会导致给定代码的NA

  • 问题内容: 这个问题已经在这里有了答案 : 使用pandas GroupBy.agg()对同一列进行多次聚合 (3个答案) 去年关闭。 示例数据集: 我想通过和对这个数据集的观察进行分组,并对每个组求和。所以我用了这样的东西… 在使用时,我能够获得“ SQL-like”输出。我的问题是我无法在此处 重命名聚合变量。因此,在SQL中,如果想做上述事情,我会做这样的事情: 正如我们看到的,它很容易让我

  • 问题内容: 所以我的数据框看起来像这样: 每个站点的分数因国家/地区而异。我正在尝试查找每个站点/国家/地区组合得分的1/3/5天差异。 输出应为: 我首先尝试按网站/国家/日期排序,然后按网站和国家/地区分组,但是我无法从分组对象中获得区别。 问题答案: 首先,对DataFrame排序,然后您需要做的是: 不支持任意排序。如果您需要进行任意排序(例如Google在fb之前),则需要将它们存储在集