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
excludeNaN
s:
最后一列Name
bySeries
创建人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