我有一个数据框如下。

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


提前致谢

最佳答案

我认为,需要三步解决

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大于1的值

# 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)w.r.t长度。

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

关于python - Python- Pandas 轮流爆炸,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53314441/

10-12 18:36