将两个带有None值的序列连接起来(pandas DataFrame)?

3
我正在尝试在pandas DataFrame中连接两个列。问题是,当任一系列中存在None值时,结果为NaN。 由于实际数据非常庞大,并且需要保留原始的None值以供以后参考,因此我希望不更改列中的原始值即可实现此操作。在pandas中有没有一种方法可以实现这一点呢?
创建示例DataFrame的代码如下:
import pandas as pd
f = pd.DataFrame([['a', 'b','c','a', 'b','c'],['1', '2','3', '4', '5','6', ]])
f = f.transpose()
f.columns = ['xx', 'yy']
f.xx[0] = None
f.yy[0] = None
f.xx[2] = None
f.yy[3] = None

    xx      yy
0   None    None
1   b       2
2   None    3
3   a       None
4   b       5
5   c       6

我尝试了 f['new_str'] = f.xx + f.yyf['new_str'] = f['xx'] + f['yy']。如果任意一个值是 None 类型,则两者都会将连接的值设置为 NaN。我认为这是因为 Pandas 处理 None 类型的方式导致的。None 类型和 str 类型不能通过 '+' 运算符进行 "相加"。

    xx      yy      new_str
0   None    None    NaN
1   b       2       b2
2   None    3       NaN
3   a       None    NaN
4   b       5       b5
5   c       6       c6

我想要做的是:

f['new_str'] = f.xx.map(lambda x: '')
for idx, arow in f.iterrows():
    con = ''
    if arow.xx:
        con += arow.xx
    if arow.yy:
        con += arow.yy
    f.loc[idx,'new_str'] = con
f
    xx      yy      new_str
0   None    None    
1   b       2       b2
2   None    3       3
3   a       None    a
4   b       5       b5
5   c       6       c6  

我的问题是,pandas是否支持更优雅/简单的方法来实现这一点?
1个回答

6

在每一列上调用fillna,将Nones设置为'',这是字符串拼接下的身份元素。

f['new_str'] = f.xx.fillna('') + f.yy.fillna('')

这将会给你一个新的列,格式化方式与你所需相同:

>>> f
     xx    yy new_str
0  None  None        
1     b     2      b2
2  None     3       3
3     a  None       a
4     b     5      b5
5     c     6      c6

2
同样的方法,但不够简洁: f.apply(lambda row: (row['xx'] or '') + (row['yy'] or ''),axis=1) - Liam Foley
@pneumatics 谢谢。在原始数据中,原始字段不需要更改,因为“None”和空字符串传达了不同的含义。有没有一种方法可以在不更改原始列的情况下完成这个操作?谢谢。 - Bin
1
@Bin 试一下,这不会改变 xxyy 列中的值,因为它们没有被赋值在左侧。fillna 在数据的副本上工作。 - pneumatics
2
FYI,Liam Foley的解决方案在我的机器上快了1.54倍。它也不会创建任何大型的中间对象,因此内存使用情况也更好。 - Martin Valgur
@Martin Valgur 感谢您测试速度。 - Bin
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接