【问题标题】:pandas dataframe adding value to a cell by matching column header and value熊猫数据框通过匹配列标题和值向单元格添加值
【发布时间】:2018-11-15 09:54:03
【问题描述】:

我有一个这样的数据框:

Num  A    B   C   D
1    wer
1    df
1    ffg
2    asd
2    vb
3    ncnc
3    oiji
4    qwe

我会先根据Num过滤掉,假设我过滤Num = 1

    Num  A    B   C   D
    1    wer
    1    df
    1    ffg

现在我需要在werC 相遇的单元格中添加一个变量的值,与ffgD 类似

Num  A    B   C   D
1    wer      5
1    df
1    ffg          7

如果某个值已经存在,则应该用新值替换它

【问题讨论】:

    标签: python pandas dataframe assign


    【解决方案1】:

    或者更容易阅读、更简洁的方式:

    df2=df[df['Num']==1]
    df2.loc[df2['A']=='wer','C']=5
    df2.loc[df2['A']=='ffg','D']=7
    

    或跳过警告,按索引执行:

    df2=df[df['Num']==1]
    df2.loc[0,'C']=5
    df2.loc[2,'D']=7
    

    两种情况:

    print(df2)
    

    是:

       Num    A   B    C    D
    0    1  wer NaN  5.0  NaN
    1    1   df NaN  NaN  NaN
    2    1  ffg NaN  NaN  7.0
    

    如果想放回实际数据框:

    df[df['Num']==1]=df2
    

    【讨论】:

    • 会在dataframe中修改吗?
    • 当您只想更新几个值时,更新子集数据帧并分配回子集效率低下。这不是the docs 推荐的。
    【解决方案2】:

    布尔索引是 Pandas 的基础:阅读 Indexing and Selecting Data

    对于您的问题,您可以构造布尔掩码并将它们组合起来以使用pd.DataFrame.loc 更新值:

    num_mask = df['num'] == 1
    df.loc[num_mask & df['A'].eq('wer'), 'C'] = 5
    df.loc[num_mask & df['A'].eq('ffg'), 'D'] = 7
    

    由于最昂贵的部分通常是构建布尔系列,因此在可能的情况下重用它们是一种很好的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2019-05-21
      • 2020-09-21
      • 2021-08-08
      相关资源
      最近更新 更多