复制匹配Pandas中多列模式的列值

时间:2017-10-10 22:12:20

标签: python pandas

我碰巧有以下DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({ 'Prod1':   ['10','','10','','',''],
                    'Prod2':   ['','5','5','','','5'],
                    'Prod3':   ['','','','8','8','8'],
                    'String1': ['','','','','',''],
                    'String2': ['','','','','',''],
                    'String3': ['','','','','',''],
                    'X1':      ['x1','x2','x3','x4','x5','x6'],
                    'X2':      ['','','y1','','','y2']
                    })
print(df)

  Prod1 Prod2 Prod3 String1 String2 String3  X1  X2
0    10                                      x1    
1           5                                x2    
2    10     5                                x3  y1
3                 8                          x4    
4                 8                          x5    
5           5     8                          x6  y2

这是带有相关字符串的产品的示意图表;实际字符串位于列(X1X2)中,但最终应根据对应的字段移至(String1String2String3)产品是否有价值。

例如: 行0的值为Prod1,因此x1应移至String1。 行1的值为Prod2,因此x2应移至String2

在实际数据集中,大多数Prod都有一个String,但是有些行在Prods中找到多个值,而String列应该填充优先于左边。最终结果应如下所示:

  Prod1 Prod2 Prod3 String1 String2 String3 X1 X2
0    10                  x1                      
1           5                    x2              
2    10     5            x3      y1              
3                 8                      x4      
4                 8                      x5      
5           5     8              x6      y1      

我在考虑嵌套的列/行循环,但我仍然不熟悉pandas来解决问题。 非常感谢您提出任何建议!

1 个答案:

答案 0 :(得分:3)

我打破了步骤:

df[['String1', 'String2', 'String3']]=(df[['Prod1', 'Prod2', 'Prod3']]!='')
df1=df[['String1', 'String2', 'String3']].replace({False:np.nan}).stack().to_frame()
df1[0]=df[['X1','X2']].replace({'':np.nan}).stack().values
df[['String1', 'String2', 'String3']]=df1[0].unstack()
df.replace({None:''})


Out[1036]: 
  Prod1 Prod2 Prod3 String1 String2 String3  X1  X2
0    10                  x1                  x1    
1           5                    x2          x2    
2    10     5            x3      y1          x3  y1
3                 8                      x4  x4    
4                 8                      x5  x5    
5           5     8              x6      y2  x6  y2