【问题标题】:Concatenate column values in Pandas DataFrame with "NaN" values将 Pandas DataFrame 中的列值与“NaN”值连接起来
【发布时间】:2014-05-03 13:09:30
【问题描述】:

我正在尝试用 NaN 值连接 Pandas DataFrame 列。

In [96]:df = pd.DataFrame({'col1' : ["1","1","2","2","3","3"],
                'col2'  : ["p1","p2","p1",np.nan,"p2",np.nan], 'col3' : ["A","B","C","D","E","F"]})

In [97]: df
Out[97]: 
  col1 col2 col3
0    1   p1    A
1    1   p2    B
2    2   p1    C
3    2  NaN    D
4    3   p2    E
5    3  NaN    F

In [98]: df['concatenated'] = df['col2'] +','+ df['col3']
In [99]: df
Out[99]: 
  col1 col2 col3 concatenated
0    1   p1    A         p1,A
1    1   p2    B         p2,B
2    2   p1    C         p1,C
3    2  NaN    D          NaN
4    3   p2    E         p2,E
5    3  NaN    F          NaN

我想在这个例子中分别得到“D”和“F”,而不是“连接”列中的“NaN”值?

【问题讨论】:

    标签: python pandas concatenation dataframe


    【解决方案1】:

    我不认为你的问题是微不足道的。但是,这里有一个使用 numpy 向量化的解决方法:

    In [49]: def concat(*args):
        ...:     strs = [str(arg) for arg in args if not pd.isnull(arg)]
        ...:     return ','.join(strs) if strs else np.nan
        ...: np_concat = np.vectorize(concat)
        ...: 
    
    In [50]: np_concat(df['col2'], df['col3'])
    Out[50]: 
    array(['p1,A', 'p2,B', 'p1,C', 'D', 'p2,E', 'F'], 
          dtype='|S64')
    
    In [51]: df['concatenated'] = np_concat(df['col2'], df['col3'])
    
    In [52]: df
    Out[52]: 
      col1 col2 col3 concatenated
    0    1   p1    A         p1,A
    1    1   p2    B         p2,B
    2    2   p1    C         p1,C
    3    2  NaN    D            D
    4    3   p2    E         p2,E
    5    3  NaN    F            F
    
    [6 rows x 4 columns]
    

    【讨论】:

    • 嘿,谢谢 Kiwi,看来这是最简单的方法。 :)
    • 不知道为什么,但我不得不稍微改变一下,即strs = [str(arg) for arg in args if not arg == 'nan']return ','.join(filter(None, strs)) if strs else ''
    【解决方案2】:

    我们可以使用stack 来删除NaN,然后使用groupby.agg','.join 字符串:

    df['concatenated'] = df[['col2', 'col3']].stack().groupby(level=0).agg(','.join)
    
      col1 col2 col3 concatenated
    0    1   p1    A         p1,A
    1    1   p2    B         p2,B
    2    2   p1    C         p1,C
    3    2  NaN    D            D
    4    3   p2    E         p2,E
    5    3  NaN    F            F
    

    【讨论】:

      【解决方案3】:

      对于整个数据框或您想要的列,您可以先用空字符串替换 NaN。

      In [6]: df = df.fillna('')
      
      In [7]: df['concatenated'] = df['col2'] +','+ df['col3']
      
      In [8]: df
      Out[8]:
        col1 col2 col3 concatenated
      0    1   p1    A         p1,A
      1    1   p2    B         p2,B
      2    2   p1    C         p1,C
      3    2         D           ,D
      4    3   p2    E         p2,E
      5    3         F           ,F
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 2017-12-02
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多