gpt4 book ai didi

python - 合并(连接)带有缺失值和不同类型(str & int)的 Pandas 列

转载 作者:行者123 更新时间:2023-12-03 22:59:41 25 4
gpt4 key购买 nike

我有一个 Dataframe,它有一列整数,我想将它与一个带有字符串值的列结合起来。两列都是对象数据类型。问题是这些列也可以是 NaN。
我能够找到的解决方案会导致不同的错误或不良结果。
我的数据框如下所示:


指数
剂量持续时间单位
剂量值
剂量单位
数量值


0

NaN
NaN
NaN

1

NaN
平板电脑
NaN

2

2
NaN
NaN

3

1
平板电脑
NaN

4

2
平板电脑
NaN


创建数据框的代码:

df = pd.DataFrame([["day",None,None,None],["day",None,"tablet(s)",None],["day",2,"tablet(s)",None],["day",1,"tablet(s)",None],["day",2,"tablet(s)",None]], columns=["dosagedurationunit","dosagequantityvalue","dosagequantityunit","quantityvalue"])
以下答案适用于相同类型 (str) 的列:
Combine pandas string columns with missing values
  • 在连接之前将列转换为 str dtype 会产生“nan”字符串,例如“NaN tablet(s)”。
  • 当要“连接”的列之一中有整数时,使用以下代码会导致类型错误。
  • df['DOSE'] = df[['dosagequantityvalue', 'dosagequantityunit']].apply(
    lambda x: None if x.isnull().all() else ' '.join(x.dropna()), axis=1)
  • 类型错误:序列项 0:预期的 str 实例,找到 int

  • 所需的输出数据帧:


    指数
    剂量持续时间单位
    剂量值
    剂量单位
    数量值
    NORMALIZED_DOSE


    0

    NaN
    NaN
    NaN
    NaN

    1

    NaN
    平板电脑
    NaN
    平板电脑

    2

    2
    NaN
    NaN
    2

    3

    1
    平板电脑
    NaN
    1 片

    4

    2
    平板电脑
    NaN
    2片


    实际上,NaN 或“片剂”的 NORAMLIZED_DOSE 提供零信息。我可以删除剂量数量值为 NaN 的所有行,但我不知道这是否适用于生产/非样本数据集。此外,我还需要一个函数来优雅地处理这个操作。
    在处理一列或两列中可能有整数和 NaN 值的情况时,如何将两列(剂量数量值和剂量数量单位)连接到一个新列 (NORMALIZED_DOSE) 中?

    最佳答案

    更新
    如果我将答案放在函数中 replace_concat_replace() :

    def replace_concat_replace(df):
    df = df.replace(np.nan, '').astype(str)
    s = df.dosagequantityvalue + ' ' + df.dosagequantityunit
    s = s.str.strip().replace('', np.nan)
    return s
    然后它的 %timeitconcat_df_cols_new() 快约 2.5 倍:
    >>> %timeit df['NORMALIZED_DOSAGE'] = replace_concat_replace(df[['dosagequantityvalue', 'dosagequantityunit']])
    41.7 ms ± 2.21 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

    >>> %timeit df['NORMALIZED_DOSAGE'] = concat_df_cols_new(df[['dosagequantityvalue', 'dosagequantityunit']])
    105 ms ± 15.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    然而, concat_df_cols_new()可以处理任意列。

    原答案
    您可以 replace() nan带有空字符串 ''在连接之前,然后 replace() 他们在concat之后回来。
    请注意,我使用了 nan而不是 None匹配你的 table 。
    df = pd.DataFrame([['day',np.nan,np.nan,np.nan],['day',np.nan,'tablet(s)',np.nan],['day',2,np.nan,np.nan],['day',1,'tablet(s)',np.nan],['day',2,'tablet(s)',np.nan]],columns=['dosagedurationunit','dosagequantityvalue','dosagequantityunit','quantityvalue'])

    # replace nans with ''
    df = df.replace(np.nan, '')

    # concat value + unit
    df['NORMALIZED_DOSAGE'] = df.dosagequantityvalue.astype(str) + ' ' + df.dosagequantityunit.astype(str)

    # put nans back
    df = df.replace(r'^\s*$', np.nan, regex=True)
    输出:
      dosagedurationunit dosagequantityvalue dosagequantityunit quantityvalue NORMALIZED_DOSAGE
    0 day NaN NaN NaN NaN
    1 day NaN tablet(s) NaN tablet(s)
    2 day 2.0 NaN NaN 2.0
    3 day 1.0 tablet(s) NaN 1.0 tablet(s)
    4 day 2.0 tablet(s) NaN 2.0 tablet(s)

    关于python - 合并(连接)带有缺失值和不同类型(str & int)的 Pandas 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66960795/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com