【问题标题】:Create a dataframe based on another dataframe using unique values使用唯一值基于另一个数据框创建数据框
【发布时间】:2023-04-09 14:05:02
【问题描述】:

如果我有这样的 Pandas 数据框:

colA colB
 A    A1
 B    C1
 A    B1
 B    A1

colA 有 2 个唯一值(A、B),而 colB 有 3 个唯一值(A1、B1 和 C1)。

我想创建一个新的数据框,其中 colA 和 colB 都是组合,另一列 colC 是 1 或 0,基于早期 df 中的组合。

预期结果:

colA colB colC
 A    A1   1
 A    B1   1
 A    C1   0
 B    A1   1
 B    B1   0
 B    C1   1

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先由DataFrame.assign 创建新列,由1 填充,然后通过Series.unique 两列的值创建MultiIndex.from_product,在DataFrame.set_index 之后使用DataFrame.reindex - 可以为新附加行设置值colC 列由fill_value 参数:

    mux = pd.MultiIndex.from_product([df['colA'].unique(),
                                      df['colB'].unique()], names=['colA','colB'])
    df1 = df.assign(colC = 1).set_index(['colA','colB']).reindex(mux, fill_value=0).reset_index()
    print (df1)
      colA  colB  colC
    0      A  A1     1
    1      A  C1     0
    2      A  B1     1
    3      B  A1     1
    4      B  C1     1
    5      B  B1     0
    

    替代方案是使用DataFrame.set_indexSeries.unstackDataFrame.stack 重塑:

    df1 = (df.assign(colC = 1)
             .set_index(['colA','colB'])['colC']
             .unstack(fill_value=0)
             .stack()
             .reset_index(name='ColC'))
    
    print (df1)
      colA colB  ColC
    0    A   A1     1
    1    A   B1     1
    2    A   C1     0
    3    B   A1     1
    4    B   B1     0
    5    B   C1     1
    

    另一种解决方案是由itertools.product 创建新的DataFrameDataFrame.mergeindicator=True,重命名列并通过both 比较设置并将True/False 的整数转换为1/0 映射:

    from  itertools import product
    df1 = pd.DataFrame(product(df['colA'].unique(), df['colB'].unique()), columns=['colA','colB'])
    df = df1.merge(df, how='left', indicator=True).rename(columns={'_merge':'colC'})
    df['colC'] = df['colC'].eq('both').astype(int)
    print (df)
      colA colB  colC
    0    A   A1     1
    1    A   C1     0
    2    A   B1     1
    3    B   A1     1
    4    B   C1     1
    5    B   B1     0
    

    如有必要,最后按DataFrame.sort_values 按两列添加排序:

    df1 = df1.sort_values(['colA','colB'])
    

    【讨论】:

    • 你能解释一下你在做什么,特别是对 assign() 行吗?
    • @FedericoS - 完成:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多