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

熊猫根据列项目计数查找和替换

  •  0
  • chowpay  · 技术社区  · 2 年前

    我有一个这样的数据框

    import pandas as pd
    
    all_data_set = [
            ('A','Area1','AA','A B D E','A B','D E'),
            ('B','Area1','AA','A B D E','A B','D E'),
            ('C','Area2','BB','C','C','C'),
            ('E','Area1','CC','A B D E','A B','D E'),
            ('F','Area3','BB','F G','G','F')
            ]
    
    all_df = pd.DataFrame(data = all_data_set, columns = ['Name','Area','Type','Group','AA members','CC members'])
    
     Name   Area Type    Group AA members CC members
    0    A  Area1   AA  A B D E        A B        D E
    1    B  Area1   AA  A B D E        A B        D E
    2    C  Area2   BB        C          C          C
    3    E  Area1   CC  A B D E        A B        D E
    4    F  Area3   BB      F G          G          F
    

    最后一行(第4行)正确。 任何类型为BB的都应该只在 Group AA members CC members

    所以应该是这样的:

    4    F  Area3   BB        F          F          F
    

    1. 类型为时检查 BB 和长度 is=2项如下:

      df = (all_data_set.loc[(all_data_set['Type']== 'BB')]['Group'].str.split().str.len() == 2)

    2. 然后遍历每一行并找到如下情况

    3. 使用所有放置行创建新的Df,并使组、AA成员、CC成员=名称

    4. 将发生这种情况的行放在 all_df

    5. 合并 3. 返回到 all\u df

    有没有更好的方法可以做到这一点?

    2 回复  |  直到 2 年前
        1
  •  2
  •   cottontail    2 年前

    尝试

    # identify rows where Type is BB
    m = all_df['Type'] == 'BB'
    # for Type BB rows, replace Group, AA members and CC members values by Name
    all_df.loc[m, ['Group', 'AA members', 'CC members']] = all_df.loc[m, 'Name']
    print(all_df)
    
      Name   Area Type    Group AA members CC members
    0    A  Area1   AA  A B D E        A B        D E
    1    B  Area1   AA  A B D E        A B        D E
    2    C  Area2   BB        C          C          C
    3    E  Area1   CC  A B D E        A B        D E
    4    F  Area3   BB        F          F          F
    
        2
  •  2
  •   Kevin Choon Liang Yew    2 年前

    你可以试试 iloc 和for循环。

    for row in all_df.index:
        if all_df.iloc[row,2] == "BB":
            all_df.iloc[row,3:] = all_df["Name"][row]
            
    all_df
    
      Name   Area Type    Group AA members CC members
    0    A  Area1   AA  A B D E        A B        D E
    1    B  Area1   AA  A B D E        A B        D E
    2    C  Area2   BB        C          C          C
    3    E  Area1   CC  A B D E        A B        D E
    4    F  Area3   BB        F          F          F