将 Pandas DataFrame 中的列值与“NaN”值连接起来

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23444858/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 21:59:56  来源:igfitidea点击:

Concatenate column values in Pandas DataFrame with "NaN" values

pythonpandasconcatenationdataframe

提问by Nilani Algiriyage

I'm trying to concatenate Pandas DataFramecolumns with NaN values.

我正在尝试将 PandasDataFrame列与 NaN 值连接起来。

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

Instead of 'NaN' values in "concatenated" column, I want to get "D" and "F" respectively for this example?

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

回答by Kiwi

I don't think your problem is trivial. However, here is a workaround using numpy vectorization :

我不认为你的问题是微不足道的。但是,这是使用 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]

回答by sl1129

You could first replace NaNs with empty strings, for the whole dataframe or the column(s) you desire.

对于整个数据框或您想要的列,您可以先用空字符串替换 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