我有以下一列的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:删除列中的括号
答案 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
,或者有其他类型的错误数据,那么您不想完全清楚自己想要做什么,所以如果您想要其他行为,则必须进行调整。
你没有说,但我认为你想要在四舍五入后将数字转换为整数。