如何在 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
这是一个作为管道的解决方案,应该适用于任意数量的列。唯一的要求是应该能够过滤列名(这里使用 Column
和 Colum3
作为模式),否则需要构建这些列的列表并使用经典切片:
(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
所以,这里我想从第 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
这是一个作为管道的解决方案,应该适用于任意数量的列。唯一的要求是应该能够过滤列名(这里使用 Column
和 Colum3
作为模式),否则需要构建这些列的列表并使用经典切片:
(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