代码之家  ›  专栏  ›  技术社区  ›  Prakhar Agarwal

我想根据一个条件将熊猫数据帧拆分为两个数据帧

  •  1
  • Prakhar Agarwal  · 技术社区  · 7 年前

    我有一个4列的基本数据框架。

     column_A column_B  column_C   id  
    0       1       1      anna    123
    1       2       1      anna      7
    2      30       2      bob      42
    2      20       2      bob      12
    3      10       3      charlie   1
    4     100       3      david     2
    

    我想将其拆分为两个具有以下属性的不同数据帧。

    数据帧1:

     column_A column_B  column_C   id  
    0       1       1      anna    123
    1       2       1      anna      7
    2      30       2      bob      42
    2      20       2      bob      12
    

    哪里 两个值 在“B”列中“C”列匹配

    数据帧2:

      column_A column_B  column_C   id
    3      10       3      charlie   1
    4     100       3      david     2
    

    哪里 仅限值 在列中匹配

    2 回复  |  直到 7 年前
        1
  •  3
  •   Zero    7 年前

    你可以查一下有没有重复的。

    In [200]: dfs = {i: n for i, n in df.groupby(
                        df.duplicated(subset=['column_B', 'column_C'], keep=False))}
    
    In [201]: dfs[True]
    Out[201]:
       column_A  column_B column_C   id
    0         1         1     anna  123
    1         2         1     anna    7
    2        30         2      bob   42
    2        20         2      bob   12
    
    In [202]: dfs[False]
    Out[202]:
       column_A  column_B column_C  id
    3        10         3  charlie   1
    4       100         3    david   2
    
        2
  •  2
  •   Ankur Sinha    7 年前

    要保持记录不重复(第5行和第6行),请使用 drop_duplicates 功能:

    dfA = df.drop_duplicates(subset = ['column_B', 'column_C'], keep = False)
    

    输出:

       column_A  column_B column_C  column_D
    4        10         3  charlie         1
    5       100         3    davis         2
    

    要保留具有重复项的记录(第1行到第4行),请使用 duplicated 功能:

    dfB = df[df.duplicated(subset = ['column_B', 'column_C'], keep = False)]
    

    输出:

       column_A  column_B column_C  column_D
    0         1         1     anna       123
    1         2         1     anna         7
    2        30         2      bob        42
    3        20         2      bob        12