向Pandas数据帧添加系列会产生NaN列

时间:2017-08-09 19:36:39

标签: python pandas

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

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

我使用了以下命令。 。

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值。

我已经阅读了其他帖子,暗示工作中可能存在一些错误的索引,但我不确定这会如何发生。更具体地说,为什么Pandas无法排列索引,因为groupby和count来自同一个表。还有其他事情在发生吗?

5 个答案:

答案 0 :(得分:2)

我认为您需要size,而不是count,因为count排除NaN s:

Name创建的Series的{​​{3}}列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())

答案 1 :(得分:2)

您可以将结果加入初始数据框

Status:  400
  Response:
    {
      "error": {
        "message": "Unsupported get request.", 
        "code": 100, 
        "type": "GraphMethodException", 
        "fbtrace_id": "AStcsafetT"
      }
    }

输出:

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

答案 2 :(得分:1)

您也可以使用地图

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

答案 3 :(得分:0)

认为您需要使用reset_index(),它会删除层次结构并创建两个字段Name& Count.Post选择'Count'字段将其添加到dataframe。像

这样的东西
 ba_dob['New_Col'] = ba_dob.loc[ba_dob.Winner == 0.0, :].groupby('Name').Winner.count().reset_index()['count']

答案 4 :(得分:0)

您的groupby并未涵盖整个DataFrame,而只涵盖Winner == 0的行,因此对于这些行,您将获得NaN