如何在 pandas 中将多个列与多个其他列(IN CROSS)连接起来并在结果输出中给出数组?

How to join multiple column with multiple other column(IN CROSS) in pandas and giving the array in resultant output?

所以,这里我想从第 1 列取前 3 个字符(仅 alphabets/no),从第 2 列取前 4 个字符(仅 alphabets/no),从 column3a、column3b 取前 5 个数字, column3c 和 column3d(以存在者为准)并像在所需的输出列中那样制作它们的数组给定 below.Condition 是我需要删除任何类型的特殊字符,如 .,-,' 等和空格,并且只采用字母顺序和如果第 1、2 或 3 列中的任何一个不存在,则数字 characters.Also 输出应为 NaN。(如果 1 和 2 都存在并且第 3 列中的 1 存在,则输出应该出现。

Column1     Column2     Colum3a     Colum3b     Colum3c     Colum3d    S.NO DESIRED OUTPUT 
ABCDE       QWERTY      12345678    1223456     234567      1234589     1      
T.BCDF      W ERTY      567890      NaN         NaN         NaN         2
ERTYUMH     TY-IOPU     9845366     5672341     NaN         NaN         3
NaN         ERTYUI      1986788     NaN         NaN         NaN         4
SA--RTYUNK  QWPOIJH     NaN         NaN         34564557    NaN         5
WQER        QWER        NaN         NaN         NaN         NaN         6
S'E         WERTER      12233412    NaN         NaN         5678908     7

所需的输出列应如下所示:

DESIRED OUTPUT                                                        S.NO
["ABC|QWER|12345","ABC|QWER|12234","ABC|QWER|23456","ABC|QWER|12345"]   1
[TBC|WER|56789]                                                         2
["ERT|TYIO|98453","ERT|TYIO|56723"]                                     3
NaN                                                                     4
[SAR|QWPO|34564]                                                        5
NaN                                                                     6
["SE|WERT|12233","SE|WERT|56789"]                                       7

请帮助我使用以下代码 this.I m 连接,但不知道如何制作具有第 3 列的数组。

df1['column4'] = (df1['Column1'].str[:3] + '|' +
              df1['Column2'].str[:4] + '|' +
              df1['Column3'].astype(str).replace({'^nan$':None, '\.0$':''}, regex=True))

使用:

#join first 3 and 4 values in columns
s = (df1['Column1'].str.replace('\W','').str[:3] + '|' + 
     df1['Column2'].str.replace('\W','').str[:4] + '|' )

#all another columns convert to strings, replace and add to s
f = lambda x: s + x.astype(str).replace({'^nan$':None, '\.0$':''}, regex=True).str[:5]
              
#for column filtered by name ('Colum3') add values to list
df1 = (df1.filter(like='Colum3').apply(f)
          .stack()
          .groupby(level=0)
          .agg(list)
          .to_frame('new')
          .join(df['S.NO'], how='right'))

print (df1)
                                                 new  S.NO
0  [ABC|QWER|12345, ABC|QWER|12234, ABC|QWER|2345...     1
1                                   [TBC|WERT|56789]     2
2                   [ERT|TYIO|98453, ERT|TYIO|56723]     3
3                                                NaN     4
4                                   [SAR|QWPO|34564]     5
5                                                NaN     6
6                     [SE|WERT|12233, SE|WERT|56789]     7       

这是一个作为管道的解决方案,应该适用于任意数量的列。唯一的要求是应该能够过滤列名(这里使用 ColumnColum3 作为模式),否则需要构建这些列的列表并使用经典切片:

(df.filter(like='Column').apply(lambda c: c.str.replace('\W', '', regex=True).str[:3])
   .join(df['S.NO DESIRED OUTPUT'])
   .assign(Column3=df.filter(like='Colum3').apply(list, axis=1))
   .explode('Column3').dropna(subset=['Column3'])
   .assign(Column3=lambda d: d['Column3'].astype(str).str[:5])
   .set_index('S.NO DESIRED OUTPUT')
   .astype(str)  
   .apply('|'.join, axis=1)
   .groupby(level=0).apply(list)
   .rename('DESIRED OUTPUT')
   .mask(df.filter(like='Column').isna().any(1))
   .reset_index()
)

输出:

   S.NO DESIRED OUTPUT                                     DESIRED OUTPUT
0                    1  [ABC|QWE|12345, ABC|QWE|12234, ABC|QWE|23456, ...
1                    2                                    [TBC|WER|56789]
2                    3                                                NaN
3                    4                                    [nan|ERT|19867]
4                    5                                    [SAR|QWP|34564]
5                    7                                                NaN