【问题标题】:Adding new row in dataframe with conditional split of previous row在数据框中添加新行并有条件拆分前一行
【发布时间】:2019-04-28 21:48:58
【问题描述】:

如果特定列值中存在“或”条件,则它必须通过数据框中的先前值拆分并创建新行。尝试拆分和连接无法获得所需的输出,非常感谢任何帮助
输入

  col1   col2           col3              col4
0  x     bca or cba     value1 or null    x1 or x2
1  y     bca            value2            x1

输出

   col1   col2           col3        col4
 0  x     bca            value1      x1
 1  x     cba            null        x2
 2  y     bca            value2      x1

【问题讨论】:

    标签: python pandas python-2.7 numpy dataframe


    【解决方案1】:

    用途:

    cols = df.columns
    
    df = (df.join(df.pop('col2')
            .str.split(' or ', expand=True)
            .stack()
            .reset_index(level=1, drop=True)
            .rename('col2'))
          ).reset_index(drop=True).reindex(columns=cols)
    print (df)
      col1 col2    col3
    0    x  bca  value1
    1    x  cba  value1
    2    y  bca  value2
    

    解释

    1. 第一个pop 列用于提取split 列与expand = TrueDataFrame
    2. stack重塑
    3. reset_index 用于删除 MultiIndex 的第一级
    4. rename Series 按新列名
    5. 然后join 到原来的df
    6. 函数 reset_index 是唯一索引所必需的
    7. 最后一个reindex 用于相同顺序的列名称

    编辑:

    df = (df.set_index('col1')
            .stack()
            .str.split(' or ', expand=True)
            .stack()
            .unstack(1)
            .reset_index(level=1, drop=True)
            .reset_index()
    
    )
    print (df)
    
      col1 col2    col3 col4
    0    x  bca  value1   x1
    1    x  cba    null   x2
    2    y  bca  value2   x1
    

    【讨论】:

    • 谢谢jezrael的详细解释
    • @AshokkumarP - 欢迎您!如果我的回答有帮助,请不要忘记accept。谢谢。
    • @jezral - 有什么方法可以弹出多列?
    • @AshokkumarP - 你能解释更多吗?
    • df.pop() 一次只支持一列
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2020-02-22
    • 1970-01-01
    • 2020-03-23
    相关资源
    最近更新 更多