Python 将系列添加到Pandas数据帧会产生NaN列

Python 将系列添加到Pandas数据帧会产生NaN列,python,pandas,Python,Pandas,使用此数据集(为了简洁起见,省略了一些列和数百行) 我使用了以下命令 ba_dob.loc[ba_dob.Winner == 0.0, :].groupby('Name').Winner.count() 要创建以下系列 Name Ali MacGraw 1 Amy Adams 1 Angela Bassett 1 Angelina Jolie 1 Anjelica Huston

使用此数据集(为了简洁起见,省略了一些列和数百行)

我使用了以下命令

ba_dob.loc[ba_dob.Winner == 0.0, :].groupby('Name').Winner.count()
要创建以下系列

Name
Ali MacGraw                1
Amy Adams                  1
Angela Bassett             1
Angelina Jolie             1
Anjelica Huston            1
Ann Harding                1
Ann-Margret                1
Anna Magnani               1
Anne Bancroft              4
Anne Baxter                1
Anne Hathaway              1
Annette Bening             3
Audrey Hepburn             4
我试着把这个系列添加到原始数据框中,就像这样

ba_dob['New_Col'] = ba_dob.loc[ba_dob.Winner == 0.0, :].groupby('Name').Winner.count()
我有一列NaN值


我读过其他一些帖子,它们暗示在工作中可能存在一些错误的索引,但我不确定这会如何改变。更具体地说,为什么熊猫不能排列索引,因为groupby和count来自同一个表。还有其他事情正在进行吗?

您认为需要使用reset_index(),它删除层次结构并创建两个字段Name和Count.Post,选择“Count”字段将其添加到数据帧。差不多

 ba_dob['New_Col'] = ba_dob.loc[ba_dob.Winner == 0.0, :].groupby('Name').Winner.count().reset_index()['count']
我认为您需要,不是,因为
count
exclude
NaN
s:

最后一列
Name
by
Series
创建人
groupby

m = ba_dob.Winner == 0.0
ba_dob['new'] = ba_dob['Name'].map(ba_dob[m].groupby('Name').Winner.size())
print (ba_dob)
        Year  Ceremony         Award  Winner            Name  new
0  1927/1928         1  Best Actress     0.0  Louise Dresser    1
1  1927/1928         1  Best Actress     1.0    Janet Gaynor    1
2       1937        10  Best Actress     0.0    Janet Gaynor    1
3  1927/1928         1  Best Actress     0.0  Gloria Swanson    3
4  1929/1930         3  Best Actress     0.0  Gloria Swanson    3
5       1950        23  Best Actress     0.0  Gloria Swanson    3
另一个解决方案:

ba_dob['new'] = ba_dob['Name'].map(ba_dob.loc[m, 'Name'].value_counts())

您可以在初始数据帧上加入结果

New_col = df.loc[df.Winner == 0.0, :].groupby('Name').Winner.count().rename('New_col')
df = df.join(New_col, on='Name')
输出:

    Award           Ceremony    Name            Winner  Year New_col
0   Best Actress    1927/1928   Louise Dresser  0.0     0    1
1   Best Actress    1927/1928   Janet Gaynor    1.0     1    1
2   Best Actress    1937        Janet Gaynor    0.0     2    1
3   Best Actress    1927/1928   Gloria Swanson  0.0     3    3
4   Best Actress    1929/1930   Gloria Swanson  0.0     4    3
5   Best Actress    1950        Gloria Swanson  0.0     5    3
你也可以使用地图

mapper = ba_dob.loc[ba_dob.Winner == 0.0, :].groupby('Name').Winner.count()
ba_dob['New_Col'] = ba_dob['Name'].map(mapper)
你得到

    Year        Ceremony    Award       Winner  Name            New_Col
0   1927/1928   1           BestActress 0.0     Louise Dresser  1
1   1927/1928   1           BestActress 1.0     Janet Gaynor    1
2   1937        10          BestActress 0.0     Janet Gaynor    1
3   1927/1928   1           BestActress 0.0     Gloria Swanson  3
4   1929/1930   3           BestActress 0.0     Gloria Swanson  3
5   1950        23          BestActress 0.0     Gloria Swanson  3

您的
groupby
不覆盖整个
DataFrame
,而只覆盖
Winner==0
的行,因此对于这些行,您当然会得到
NaN

Hmm。由于某些原因,keyrerror。但是你确实认为索引是个问题。哦,再想一想,它不会起作用,因为重置索引意味着无法映射到数据帧的原始索引。我的坏消息令人印象深刻。我不知道转换函数或您可以要求.loc提供您尚未创建的列的概念。但它提供了很多思考的内容。请稍等,我有一个使用此实现的想法。非常好,非常感谢!在我接受之前,您能详细说明最后一行吗?Pandas提供了一个函数map(),您可以使用它将一个系列(ba_dob['Name'])的值映射到另一个系列(count)。这是一个非常有用的函数,你也可以将它与字典一起用作映射器。请看一下@jezrael的答案,你可能想使用size而不是count来包含所有行。这是有意义的,我观察到的是一列
NaNs
。没有例外。@Ryan您需要小心在浮点上执行
=
,它可能显示为
0.0
,但它是
0.0001
等。基本上,请验证您的过滤器是否正常工作,如果需要,请添加一个
epsilon
    Year        Ceremony    Award       Winner  Name            New_Col
0   1927/1928   1           BestActress 0.0     Louise Dresser  1
1   1927/1928   1           BestActress 1.0     Janet Gaynor    1
2   1937        10          BestActress 0.0     Janet Gaynor    1
3   1927/1928   1           BestActress 0.0     Gloria Swanson  3
4   1929/1930   3           BestActress 0.0     Gloria Swanson  3
5   1950        23          BestActress 0.0     Gloria Swanson  3