【问题标题】:Duplicating rows in pandas Python在 Pandas Python 中复制行
【发布时间】:2021-09-05 14:35:51
【问题描述】:

我希望你做得很好。我有以下输出:

ClassName   Bugs   HighBugs  LowBugs  NormalBugs  WMC   LOC

 Class1      4        0        1         3        34     77 
 Class2      0        0        0         0        9      45
 Class3      3        0        1         2        10     18
 Class4      0        0        0         0        44     46
 Class5      6        2        2         2        78     94

我想要的结果如下:

ClassName   Bugs   HighBugs  LowBugs  NormalBugs  WMC   LOC

 Class1      1        0        0         1        34     77
 Class1      1        0        0         1        34     77
 Class1      1        0        0         1        34     77
 Class1      1        0        1         0        34     77
 Class2      0        0        0         0        9      45
 Class3      1        0        0         1        10     18
 Class3      1        0        0         1        10     18
 Class3      1        0        1         0        10     18
 Class4      0        0        0         0        44     46
 Class5      1        0        0         1        78     94
 Class5      1        0        0         1        78     94
 Class5      1        0        1         0        78     94
 Class5      1        0        1         0        78     94
 Class5      1        1        0         0        78     94
 Class5      1        1        0         0        78     94

一点解释,我想要的是根据列 BugsBugs = HighBugs + LowBugs + NormalBugs 复制类,如您在 中所见我想要的结果是,当类被复制时,我们只有一个和零,这取决于 Bugs 的数量。

提前谢谢大家,祝大家有个美好的一天。

【问题讨论】:

    标签: python pandas dataframe datatable multiple-columns


    【解决方案1】:

    试试:

    dfs, col_names, other_cols = (
        [],
        ["NormalBugs", "LowBugs", "HighBugs"],
        ["ClassName", "WMC", "LOC"],
    )
    for _, row in df.iterrows():
        if row["Bugs"] == 0:
            dfs.append(
                pd.DataFrame(
                    [[0, 0, 0, *[row[c] for c in other_cols]]],
                    columns=col_names + other_cols,
                )
            )
    
        else:
            for c in col_names:
                dfs.append(pd.DataFrame([1] * row[c], columns=[c]))
                for oc in other_cols:
                    dfs[-1][oc] = row[oc]
    
    
    df_out = pd.concat(dfs).fillna(0)
    df_out[col_names] = df_out[col_names].astype(int)
    df_out["Bugs"] = df_out[col_names].any(axis=1).astype(int)
    print(
        df_out[
            ["ClassName", "Bugs", "HighBugs", "LowBugs", "NormalBugs", "WMC", "LOC"]
        ]
    )
    

    打印:

      ClassName  Bugs  HighBugs  LowBugs  NormalBugs  WMC  LOC
    0    Class1     1         0        0           1   34   77
    1    Class1     1         0        0           1   34   77
    2    Class1     1         0        0           1   34   77
    0    Class1     1         0        1           0   34   77
    0    Class2     0         0        0           0    9   45
    0    Class3     1         0        0           1   10   18
    1    Class3     1         0        0           1   10   18
    0    Class3     1         0        1           0   10   18
    0    Class4     0         0        0           0   44   46
    0    Class5     1         0        0           1   78   94
    1    Class5     1         0        0           1   78   94
    0    Class5     1         0        1           0   78   94
    1    Class5     1         0        1           0   78   94
    0    Class5     1         1        0           0   78   94
    1    Class5     1         1        0           0   78   94
    

    编辑:添加了更多列。

    【讨论】:

    • 谢谢你回答它有效,但我仍然有其他列(指标)我想让,不仅仅是错误(如果它们也被复制也不是问题),我编辑了我的代码以上,方便大家理解,谢谢
    【解决方案2】:

    我们可以尝试在axis=1 上使用DataFrame.max 查找给定行中的最大值,然后使用Index.repeat 根据给定类中的最大值扩展DataFrame。最后,我们可以使用groupby cumcount计算每个组的行数,并比较当前值为DataFrame.gt的组行数:

    cols = df.columns[df.columns.str.endswith('Bugs')]
    df = df.loc[
        df.index.repeat(df[cols].max(axis=1).clip(lower=1))
    ].reset_index(drop=True)
    df[cols] = df[cols].gt(df.groupby('ClassName').cumcount(), axis=0).astype(int)
    

    df:

       ClassName  Bugs  HighBugs  LowBugs  NormalBugs
    0     Class1     1         0        1           1
    1     Class1     1         0        0           1
    2     Class1     1         0        0           1
    3     Class1     1         0        0           0
    4     Class2     0         0        0           0
    5     Class3     1         0        1           1
    6     Class3     1         0        0           1
    7     Class3     1         0        0           0
    8     Class4     0         0        0           0
    9     Class5     1         1        1           1
    10    Class5     1         1        1           1
    11    Class5     1         0        0           0
    12    Class5     1         0        0           0
    13    Class5     1         0        0           0
    14    Class5     1         0        0           0
    

    设置:

    import pandas as pd
    
    df = pd.DataFrame({
        'ClassName': {0: 'Class1', 1: 'Class2', 2: 'Class3', 3: 'Class4',
                      4: 'Class5'},
        'Bugs': {0: 4, 1: 0, 2: 3, 3: 0, 4: 6},
        'HighBugs': {0: 0, 1: 0, 2: 0, 3: 0, 4: 2},
        'LowBugs': {0: 1, 1: 0, 2: 1, 3: 0, 4: 2},
        'NormalBugs': {0: 3, 1: 0, 2: 2, 3: 0, 4: 2}
    })
    

    列过滤器:

    cols = df.columns[df.columns.str.endswith('Bugs')]
    
    Index(['Bugs', 'HighBugs', 'LowBugs', 'NormalBugs'], dtype='object')
    

    每行最大值(重复):

    df[cols].max(axis=1).clip(lower=1)
    
    0    4
    1    1
    2    3
    3    1
    4    6
    dtype: int64
    

    缩放数据框:

    df = df.loc[
        df.index.repeat(df[cols].max(axis=1).clip(lower=1))
    ].reset_index(drop=True)
    
       ClassName  Bugs  HighBugs  LowBugs  NormalBugs
    0     Class1     4         0        1           3
    1     Class1     4         0        1           3
    2     Class1     4         0        1           3
    3     Class1     4         0        1           3
    4     Class2     0         0        0           0
    5     Class3     3         0        1           2
    6     Class3     3         0        1           2
    7     Class3     3         0        1           2
    8     Class4     0         0        0           0
    9     Class5     6         2        2           2
    10    Class5     6         2        2           2
    11    Class5     6         2        2           2
    12    Class5     6         2        2           2
    13    Class5     6         2        2           2
    14    Class5     6         2        2           2
    

    组行:

    df.groupby('ClassName').cumcount()
    
    0     0
    1     1
    2     2
    3     3
    4     0
    5     0
    6     1
    7     2
    8     0
    9     0
    10    1
    11    2
    12    3
    13    4
    14    5
    dtype: int64
    

    将数字转换为二进制的比较

    df[cols].gt(df.groupby('ClassName').cumcount(), axis=0)
    
         Bugs  HighBugs  LowBugs  NormalBugs
    0    True     False     True        True
    1    True     False    False        True
    2    True     False    False        True
    3    True     False    False       False
    4   False     False    False       False
    5    True     False     True        True
    6    True     False    False        True
    7    True     False    False       False
    8   False     False    False       False
    9    True      True     True        True
    10   True      True     True        True
    11   True     False    False       False
    12   True     False    False       False
    13   True     False    False       False
    14   True     False    False       False
    

    【讨论】:

    • 感谢您的回答,如果我的专栏没有以“错误”结尾怎么办?
    • 只需更改cols -> cols = ['col1', 'col2', 'col3', ... etc]
    • 你能看看我上面的代码吗,我编辑了它,看看你怎么做?提前谢谢你
    猜你喜欢
    • 2014-07-24
    • 2021-08-03
    • 2018-11-20
    • 2018-05-06
    • 2015-01-12
    • 1970-01-01
    • 2021-08-05
    • 2021-11-07
    相关资源
    最近更新 更多