Python:基于两列在dataFrame中创建新行

Python:基于两列在dataFrame中创建新行,python,pandas,Python,Pandas,我有以下数据帧'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+

我有以下数据帧'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'包含每个'order'的一行,以及相应的'product'。所有其他列保留其内容。此外,如果“Cust id”列中的一行为NaN,则应删除完整的行(即新df中不存在)。这将产生以下新的_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'
非常感谢您的帮助/指导。

您可以使用:

#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'
按注释编辑:

用于创建
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'

谢谢你的帮助,耶斯雷尔,非常感谢。创建df1时,出现ValueError(“无法从重复轴重新索引”)。知道如何解决这个问题吗?然后试试
df=pd.concat([s1,s2],keys=('Orders','Products'),axis=1)
抱歉,因为我只打电话,所以没有经过测试。非常感谢,但您的初始代码似乎确实有效,我的数据中有一个错误。
...
...
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'