【问题标题】:Concatenating two series with None value (pandas DataFrame)?连接两个系列与无值(熊猫数据框)?
【发布时间】:2016-03-22 00:16:16
【问题描述】:

我正在尝试连接 pandas DataFrame 中的两列。问题是当任何一个系列中都没有值时,结果是 NaN。 由于真实数据非常大,保留原来的None值是有参考价值的,希望不要改变列中的原始值。有没有办法在熊猫中实现这一点?

创建一个示例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。我认为这是由于熊猫如何处理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  

我的问题是,熊猫是否支持更优雅/更简单的方式来实现这一目标?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    在每一列上调用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
    

    【讨论】:

    • 同样的方法,但不够干净:f.apply(lambda row: (row['xx'] or '') + (row['yy'] or ''),axis=1)
    • @pneumatics 谢谢。在原始数据中,不需要更改原始字段,因为'None'和空字符串传达的含义不同。有没有办法在不改变原始列的情况下做到这一点?谢谢。
    • @Bin 试试看,这不会改变xxyy 列中的值,因为它们没有分配在左侧。 fillna 处理数据的副本。
    • @Liam Foley 谢谢。我刚试了一下。您的代码具有所需的行为。 (row['xx'] or '') + (row['yy'] or '') 把戏真的很有趣,我以前没见过。你能在答案中解释一下吗?就像 () + () 结构的工作原理以及 row['xx'] 或 '' 的工作原理一样?谢谢。
    • 仅供参考,Liam Foley 的解决方案在我的机器上快 1.54 倍。它也不会创建任何大的中间对象,因此内存使用也更好。
    猜你喜欢
    • 1970-01-01
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2019-12-28
    • 2020-06-03
    • 2022-10-06
    相关资源
    最近更新 更多