Python Dataframe:基于(,)将列拆分为两列然后重新格式化结果值

时间:2018-01-03 20:19:15

标签: python split conditional rounding nan

我有以下一列的python数据框 - > CI_80。我想从“CI_80”列创建“CI80_lb”和“CI80_ub”。

CI_80                                       CI80_lb CI80_ub
(12.963511423826183, 15.49103403071927)     13      15
(12.287835227023837, 14.312164772976164)    12      14
(-6.4272594546429325, 27.427259454642932)   n/a     27
(nan, nan)                                  nan     nan
(-19.369658165550526, 30.77319897730662)    n/a     31

以下是我想要实现的逻辑:

步骤1:将CI_80分成两个额外的列,分隔逗号(,)

一个。下面是我尝试的代码,但它出错了

df_adhoc_3['CI80_lowerbound'], df_adhoc_3['CI80_upperbound'] = zip(*df_adhoc_3['CI_80'].map(lambda x: x.split(',')))

AttributeError:'tuple'对象没有属性'split'

步骤2:对分割

中两个已创建列中的数字进行舍入

步骤3:如果CI80_lb为负,则列值等于n / a

步骤4:如果CI_80等于(nan,nan),则使两个创建的列等于nan

步骤5:删除列中的括号

1 个答案:

答案 0 :(得分:0)

Split用于获取部分字符串。请注意,在元组中,逗号和括号实际上并不是元组的一部分,它们只是元组在显示时的格式化的一部分。 (同样,在列表[1,2,3]中,列表中没有逗号,只显示逗号以分隔实际条目。)当您有一个容器(如列表或元组)时,应使用索引。所以:

def clean(data):
    lb,ub = data
    try:
       lb= int(round(lb))
       ub= int(round(ub))
    except:
       pass
    if lb < 0 :
       lb =np.nan
    return(lb,ub) 
df_adhoc_3['CI80_lowerbound'],df_adhoc_3['CI80_lowerbound']=
df_adhoc_3['CI80'].apply(clean)

注意:

我不知道Python中的n/a。如果您想要字符串&#39; n / a&#39;,显然您可以将lb=np.nan行替换为lb = 'n/a'

如果lb和ub都是nan,则try块将失败,它将返回其原始值(nan)。如果只有一个nan,或者有其他类型的错误数据,那么您不想完全清楚自己想要做什么,所以如果您想要其他行为,则必须进行调整。

你没有说,但我认为你想要在四舍五入后将数字转换为整数。