我碰巧有以下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
这是带有相关字符串的产品的示意图表;实际字符串位于列(X1
,X2
)中,但最终应根据对应的字段移至(String1
,String2
,String3
)产品是否有价值。
例如:
行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来解决问题。 非常感谢您提出任何建议!
答案 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