【问题标题】:How to merge columns containing list values when some column list values are emptly?当某些列列表值为空时,如何合并包含列表值的列?
【发布时间】:2016-11-08 19:59:27
【问题描述】:

我想以这种方式合并数据框中的列:

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

【问题讨论】:

  • 您的列中的实际值是多少?它们只是像"A, T, G" 这样的字符串吗?什么是空值?它们是空字符串吗?您能否提供一个包含示例数据的独立示例(即生成示例 DataFrame 的代码)?
  • 列中的实际值为字母或字符串列表。该列是制表符分隔的,列中的任何空值都是空字符串i.e the empty row/columns cells are just tab jumps without any white space to represent the empty value/list. 此数据框是通过使用 pandas 合并函数连接两个数据框生成的,其中空值为 (NaN)。用于合并的键不太相关(我认为)并且没有显示。
  • 我在您的数据中没有看到任何列表。如果有列表,我希望值是,例如,["A", "T", "G"]

标签: python list pandas array-merge


【解决方案1】:

根据我对您迄今为止提供的数据的解释,看起来这些只是字符串值。

步骤:

使用str.catsep=','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

【讨论】:

    猜你喜欢
    • 2021-12-03
    • 2020-11-27
    • 1970-01-01
    • 2019-09-21
    • 2022-11-18
    • 2021-02-06
    • 1970-01-01
    • 2023-03-22
    • 2017-08-15
    相关资源
    最近更新 更多