代码之家  ›  专栏  ›  技术社区  ›  Domarius

使用loc为多行设置多列值

  •  0
  • Domarius  · 技术社区  · 1 年前

    我有这个数据框架:

         A  B  C  D  E  F  G  H  I  J  K
    0    .  .  .  .  .  .  X  L  .  .  .
    1    .  .  .  .  .  .  X  A  .  .  .
    .
    .
    .
    300  .  .  .  .  .  .  X  R  .  .  .
    301  .  .  .  .  .  . nan R  .  .  .
    302  .  .  .  .  .  .  X  R  .  .  .
    303  .  .  .  .  .  . nan R  .  .  .
    

    如果H=R,我试图将列G和列I更改为U。 预期输出:

         A  B  C  D  E  F  G  H  I  J  K
    0    .  .  .  .  .  .  X  L  .  .  .
    1    .  .  .  .  .  .  X  A  .  .  .
    .
    .
    .
    300  .  .  .  .  .  .  U  R  U  .  .
    301  .  .  .  .  .  .  U  R  U  .  .
    302  .  .  .  .  .  .  U  R  U  .  .
    303  .  .  .  .  .  .  U  R  U  .  .
    

    有没有一种方法可以将多个列传递到loc,而不是这样做两次,或者必须像这样循环两次,这看起来不是Python:

    df.loc[df['H']=='R','G']='U'

    df.loc[df['H']=='R','I']='U'

    我认为这将是微不足道的,但找不到任何明确的解决方案。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Amira Bedhiafi    1 年前

    正如@Tim已经提到的,您可以按照以下方式进行: 进口熊猫作为pd

    data = {
        'A': ['.']*304,
        'B': ['.']*304,
        'C': ['.']*304,
        'D': ['.']*304,
        'E': ['.']*304,
        'F': ['.']*304,
        'G': ['.']*301 + ['nan', 'X', 'nan'],
        'H': ['L', 'A'] + ['R']*301,
        'I': ['.']*304,
        'J': ['.']*304,
        'K': ['.']*304
    }
    
    df = pd.DataFrame(data)
    
    # Modify 'G' and 'I' columns where 'H' is 'R'
    df.loc[df['H'] == 'R', ['G', 'I']] = 'U'
    
    print(df)
    

    如果您想得到H=R,然后将G设置为U,将I设置为M,例如在单个线性中:

    df.loc[df['H'] == 'R', ['G', 'I']] = df.loc[df['H'] == 'R'].assign(G='U', I='M')[['G', 'I']]