【问题标题】:Python Pandas: Create new rows in dataFrame based on two columnsPython Pandas:基于两列在dataFrame中创建新行
【发布时间】:2016-07-25 13:57:21
【问题描述】:

我有以下数据框'df',我想根据它创建一个新的df'new_df'。我在获取新的 df 时遇到了一些麻烦。

   Cust-id   Sex  Country  Orders           Products
0   'Cu1'    'F'   'FR'   'ord1 + ord2'     'A+G'
1   'Cu2'    'M'   'US'   'ord3'            'C'
2   'Cu3'    'M'   'UK'   'ord4 + ord5'     'H+Z'
3   'Cu4'    'F'   'RU'   'ord6'            'K'
4   'Cu5'    'M'   'US'   'ord7'            'T'
5    NaN     'M'   'UK'   'ord#'            'K'
6   'Cu6'    'F'   'US'   'ord8+ord9+ord10' 'R+D+S'  
7   'Cu7'    'M'   'UK'   'ord11'           'A'

我希望“new_df”为每个“订单”和相应的“产品”包含一行。所有其他列保留其内容。此外,如果“Cust-id”列中的一行是 NaN,则应删除完整的行(即不存在于新的 df 中)。这将给出以下 new_df:

   Cust-id   Sex  Country  Orders   Products
0   'Cu1'    'F'   'FR'   'ord1'     'A'
1   'Cu1'    'F'   'FR'   'ord2'     'G'
2   'Cu2'    'M'   'US'   'ord3'     'C'
3   'Cu3'    'M'   'UK'   'ord4'     'H'
4   'Cu3'    'M'   'UK'   'ord5'     'Z'
5   'Cu4'    'F'   'RU'   'ord6'     'K'
6   'Cu5'    'M'   'US'   'ord7'     'T'
7   'Cu6'    'F'   'US'   'ord8'     'R'  
8   'Cu6'    'F'   'US'   'ord9'     'D' 
9   'Cu6'    'F'   'US'   'ord10'    'S'   
10  'Cu7'    'M'   'UK'   'ord11'    'A'

感谢任何帮助/指导。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用:

    #remove ', split by +, create Series
    s1 = df.Products.str.strip("'") 
                    .str.split('+', expand=True)
                    .stack()
                    .reset_index(drop=True, level=1)
    
    #remove ', split by +, create Series, strip spaces                    
    s2 = df.Orders.str.strip("'")
                  .str.split('+', expand=True)
                  .stack().str.strip()
                  .reset_index(drop=True, level=1)
    
    #if need add '
    s1 = "'" + s1  + "'"
    s2 = "'" + s2  + "'"
    df1 = pd.DataFrame({'Products':s1, 'Orders':s2}, index=s1.index)
    print (df1)
        Orders Products
    0   'ord1'      'A'
    0   'ord2'      'G'
    1   'ord3'      'C'
    2   'ord4'      'H'
    2   'ord5'      'Z'
    3   'ord6'      'K'
    4   'ord7'      'T'
    5   'ord#'      'K'
    6   'ord8'      'R'
    6   'ord9'      'D'
    6  'ord10'      'S'
    7  'ord11'      'A'
    
    #delete old columns, join df1, drop df if NaN in Cust-id
    print(df.drop(['Orders', 'Products'], axis=1)
            .join(df1)
            .dropna(subset=['Cust-id'])
            .reset_index(drop=True))
    
       Cust-id  Sex Country   Orders Products
    0    'Cu1'  'F'    'FR'   'ord1'      'A'
    1    'Cu1'  'F'    'FR'   'ord2'      'G'
    2    'Cu2'  'M'    'US'   'ord3'      'C'
    3    'Cu3'  'M'    'UK'   'ord4'      'H'
    4    'Cu3'  'M'    'UK'   'ord5'      'Z'
    5    'Cu4'  'F'    'RU'   'ord6'      'K'
    6    'Cu5'  'M'    'US'   'ord7'      'T'
    7    'Cu6'  'F'    'US'   'ord8'      'R'
    8    'Cu6'  'F'    'US'   'ord9'      'D'
    9    'Cu6'  'F'    'US'  'ord10'      'S'
    10   'Cu7'  'M'    'UK'  'ord11'      'A'     
    

    通过评论编辑:

    使用concat 创建df1

    ...
    ...
    df1 = pd.concat([s1, s2], keys=('Orders', 'Products'), axis=1)
    print (df1)
      Orders Products
    0    'A'   'ord1'
    0    'G'   'ord2'
    1    'C'   'ord3'
    2    'H'   'ord4'
    2    'Z'   'ord5'
    3    'K'   'ord6'
    4    'T'   'ord7'
    5    'K'   'ord#'
    6    'R'   'ord8'
    6    'D'   'ord9'
    6    'S'  'ord10'
    7    'A'  'ord11'
    
    print(df.drop(['Orders', 'Products'], axis=1)
            .join(df1)
            .dropna(subset=['Cust-id'])
            .reset_index(drop=True))
    
       Cust-id  Sex Country Orders Products
    0    'Cu1'  'F'    'FR'    'A'   'ord1'
    1    'Cu1'  'F'    'FR'    'G'   'ord2'
    2    'Cu2'  'M'    'US'    'C'   'ord3'
    3    'Cu3'  'M'    'UK'    'H'   'ord4'
    4    'Cu3'  'M'    'UK'    'Z'   'ord5'
    5    'Cu4'  'F'    'RU'    'K'   'ord6'
    6    'Cu5'  'M'    'US'    'T'   'ord7'
    7    'Cu6'  'F'    'US'    'R'   'ord8'
    8    'Cu6'  'F'    'US'    'D'   'ord9'
    9    'Cu6'  'F'    'US'    'S'  'ord10'
    10   'Cu7'  'M'    'UK'    'A'  'ord11'
    

    【讨论】:

    • 感谢您的帮助 jezrael,非常感谢。创建 df1 时会发生 ValueError(“无法从重复轴重新索引”)。知道如何解决这个问题吗?
    • 然后试试df = pd.concat([s1, s2], keys=('Orders', 'Products'), axis=1) 抱歉,未经测试,因为我只是在打电话。
    • 非常感谢,但您的初始代码似乎确实有效,我的数据中有错误。
    猜你喜欢
    • 2016-02-10
    • 2021-12-30
    • 2020-07-13
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多