【问题标题】:Python Dataframe: Split Column Into Two Columns Based on (,) THEN Reformat Resulting ValuesPython Dataframe:根据 (,) 将列拆分为两列,然后重新格式化结果值
【发布时间】:2018-01-04 04:53:56
【问题描述】:

我有以下带有一列的 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中执行此操作:df_adhoc_3['CI80_lowerbound'], df_adhoc_3['CI80_upperbound'] = df_adhoc_3['CI_80']
  • "ValueError: too many values to unpack (expected 2)" 当我尝试上面的代码时
  • 你能打印df_adhoc_3并显示输出吗?

标签: python split conditional rounding nan


【解决方案1】:

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。如果你想要字符串'n/a',显然你可以用lb = 'n/a'替换行lb=np.nan

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

您没有说,但我假设您希望在四舍五入后将数字转换为整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多