当某些列列表值为空时,如何合并包含列表值的列?
How to merge columns containing list values when some column list values are emptly?
我想以这种方式合并数据框中的列:
list_A list_B
A, T, G G, C
B, K
C, L, AG L, AG, K
F, K
输出应该是:
list_A list_B list_A&B
A, T, G G, C A, T, G, C
B, K B, K
C, L, AG L, AG, K C, L, AG, K
F, K F, K
我做到了:
df['list_A&B'] = df['list_A'].astype(list) + ', ' + df['list_B'].astype(list)
而且,我得到:
list_A list_B list_A&B
0 A, T, G G, C A, T, G, G, C
1 NaN B, K NaN
2 C, L, AG L, AG, K C, L, AG, L, AG, K
3 F, K NaN NaN
这里当其中一个列表为空时,列表的并集是一个问题。但是,为什么?
然后我尝试将联合化为字符串,但现在添加的 nan 无法删除:
df['list_A&B'] = df['list_A'].astype(str) + ', ' + df['list_B'].astype(str)
给出:
list_A list_B list_A&B
0 A, T, G G, C A, T, G, G, C
1 NaN B, K nan, B, K
2 C, L, AG L, AG, K C, L, AG, L, AG, K
3 F, K NaN F, K, nan
使用此输出,我很难删除 'nan',因为它们被报告为字符串,而 dropna() 和 fillna() 无法使用它。
任何建议!
-K
根据我对您目前提供的数据的解释,看起来这些只是字符串值。
步骤:
使用 str.cat
与 sep=','
和 na_rep=''
按行连接它们,它处理 NaN
值与其他字符串字符散布,将其视为空字符。
然后,在使用 set
.
获取列表的唯一元素后,删除其中存在的不需要的空格,并使用 filter(None,...)
删除空字符串
最后,加入结果列表,使其成为列表的字符串表示形式,但不包括括号。
df['list_A&B'] = df['list_A'].str.cat(df['list_B'], ',','') \
.apply(lambda x: ', '.join(list(filter(None, set(re.sub(r"\s+", "", x) \
.split(','))))))
df # df.fillna('') to get back your desired output
开始 DF
使用:
df = pd.DataFrame({'list_A': ['A, T, G', np.NaN, 'C, L, AG ', 'F, K'],
'list_B': ['G, C', 'B, K', 'L, AG, K', np.NaN]})
df
我想以这种方式合并数据框中的列:
list_A list_B
A, T, G G, C
B, K
C, L, AG L, AG, K
F, K
输出应该是:
list_A list_B list_A&B
A, T, G G, C A, T, G, C
B, K B, K
C, L, AG L, AG, K C, L, AG, K
F, K F, K
我做到了:
df['list_A&B'] = df['list_A'].astype(list) + ', ' + df['list_B'].astype(list)
而且,我得到:
list_A list_B list_A&B
0 A, T, G G, C A, T, G, G, C
1 NaN B, K NaN
2 C, L, AG L, AG, K C, L, AG, L, AG, K
3 F, K NaN NaN
这里当其中一个列表为空时,列表的并集是一个问题。但是,为什么?
然后我尝试将联合化为字符串,但现在添加的 nan 无法删除:
df['list_A&B'] = df['list_A'].astype(str) + ', ' + df['list_B'].astype(str)
给出:
list_A list_B list_A&B
0 A, T, G G, C A, T, G, G, C
1 NaN B, K nan, B, K
2 C, L, AG L, AG, K C, L, AG, L, AG, K
3 F, K NaN F, K, nan
使用此输出,我很难删除 'nan',因为它们被报告为字符串,而 dropna() 和 fillna() 无法使用它。
任何建议! -K
根据我对您目前提供的数据的解释,看起来这些只是字符串值。
步骤:
使用 str.cat
与 sep=','
和 na_rep=''
按行连接它们,它处理 NaN
值与其他字符串字符散布,将其视为空字符。
然后,在使用 set
.
filter(None,...)
删除空字符串
最后,加入结果列表,使其成为列表的字符串表示形式,但不包括括号。
df['list_A&B'] = df['list_A'].str.cat(df['list_B'], ',','') \
.apply(lambda x: ', '.join(list(filter(None, set(re.sub(r"\s+", "", x) \
.split(','))))))
df # df.fillna('') to get back your desired output
开始 DF
使用:
df = pd.DataFrame({'list_A': ['A, T, G', np.NaN, 'C, L, AG ', 'F, K'],
'list_B': ['G, C', 'B, K', 'L, AG, K', np.NaN]})
df