我有一个如下数据框。
df = DataFrame([{'B1': '1C', 'B2': '', 'B3': '', },
{'B1': '3A', 'B2': '1A', 'B3': ''},
{'B1': '41A', 'B2': '28A', 'B3': '3A'}])
B1 B2 B3
0 1C
1 3A 1A
2 41A 28A 3A
现在,我从 B1-B3 中提取字母并将其添加到新列 U1-U3 中,得到:
B1 B2 B3 U1 U2 U3
0 1C C
1 3A 1A A A
2 41A 28A 3A A A A
我想让行像这样爆炸:
B1 B2 B3 U1 U2 U3
0 1C C
1 3A 1A A
2 3A 1A A
3 41A 28A 3A A
4 41A 28A 3A A
5 41A 28A 3A A
预先感谢
答案 0 :(得分:2)
我认为,它需要
的三步解决方案1)从数据中提取Alphabates并创建新列,
2)复制带有w.r.t值和
的行3)使用单位矩阵进行屏蔽。
df = pd.DataFrame([{'B1': '1C', 'B2': '', 'B3': '', },
{'B1': '3A', 'B2': '1A', 'B3': ''},
{'B1': '41A', 'B2': '28A', 'B3': '3A'}])
B1 B2 B3
0 1C
1 3A 1A
2 41A 28A 3A
1)从行中提取Alphabates,并指定为列
df = df.merge(df.apply(lambda x: x.str.extract('([A-Za-z])')).add_prefix('U_'), left_index=True,right_index=True,how='outer')
出局:
B1 B2 B3 U_B1 U_B2 U_B3
0 1C C NaN NaN
1 3A 1A A A NaN
2 41A 28A 3A A A A
2)您可以尝试duplicating the rows
个数据框,只要它具有多个值
# Duplicating the rows of dataframe
val = df[['U_B1','U_B2','U_B3']].notnull().sum(axis=1)
df1 = df.loc[np.repeat(val.index,val)]
-> 3)然后通过按索引分组,仅选择masked values of identity matrix
( np.identity )且每组的长度都为
df1[['U_B1','U_B2','U_B3']] = df1.groupby(df1.index)['U_B1','U_B2','U_B3'].apply(lambda x: x.dropna(axis=1).mask(np.identity(len(x))==0))
出局:
B1 B2 B3 U_B1 U_B2 U_B3
0 1C C
1 3A 1A A
1 3A 1A A
2 41A 28A 3A A
2 41A 28A 3A A
2 41A 28A 3A A