【问题标题】:Determining values for each row of a DataFrame确定 DataFrame 每一行的值
【发布时间】:2018-10-09 05:04:35
【问题描述】:

这是我的数据框

Tipo    Número  renal   dialisis
CC  260037  NULL    NULL
CC  260037  NULL    AAB
CC  165182  NULL    NULL
CC  165182  NULL    CCDE
CC  260039  NULL    NULL
CC  49740   XYZ NULL
CC  260041  NULL    NULL
CC  259653  NULL    NULL

对于 DataFrame 中的每一行,我想确定 renaldialisis 中的值是否为 NULL。那些不是NULL 的行将是1survived 列表中;如果它们都是NULL,那么它们将是0。 我的代码是:

survival = pd.read_table('Sophia_Personalizado bien.txt',encoding='utf-16')
survived = []
numero_paciente = []
lista_pacienytes= survival['Número'].values.tolist()
lista_pacienytes= sorted(set(lista_pacienytes))


for e in lista_pacienytes:
    survival_i = survival.loc[survival['Número']==e]
    renal = set(survival_i['renal'].values.tolist())
    dialisis = set(survival_i["dialisis"].values.tolist())

    print('dialisis',dialisis)
    print('renal',renal)

    if renal == 'nan' or dialisis == 'nan':
        survived.append(0)
        numero_paciente.append(e)
    else:
        survived.append(1)
        numero_paciente.append(e)

e = pd.DataFrame({'numero': numero_paciente,
                  'survival': survived})

令人惊讶的是,所有行都等于1,但正如我们在 DataFrame 中看到的那样,这不是真的。另外,

的结果
print('dialisis',dialisis)
print('renal',renal)

是:

dialisis {nan, nan}
renal {nan}

应该是NAN,因为我使用set()。 我错过了什么?谢谢

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    对于双 NaN,请参阅 this question;本质上它可能会发生,因为np.nan != np.nan,但它并不一致:

    In [75]: set(np.array([np.nan, np.nan]))
    Out[75]: {nan, nan}
    
    In [76]: set([np.nan, np.nan])
    Out[76]: {nan}
    

    关于存在过多行的问题,这归结为您将renaldialisis字符串 'nan' 而不是floatnp.nan。您可以直接与np.nan 进行比较,也可以使用np.isnan 进行比较。

    但是,请注意,惯用的 pandas(以及 NumPy)通常让您在可能的情况下一次执行一列操作,而不是选择 values 并迭代那些,所以在您的情况下,什么你要找的也可以通过以下方式获得:

    In [66]: df['survived'] = ~(df.renal.isnull() & df.dialisis.isnull())
    
    In [67]: df
    Out[67]:
      Tipo  Número renal dialisis  survived
    0   CC  260037   NaN      NaN     False
    1   CC  260037   NaN      AAB      True
    2   CC  165182   NaN      NaN     False
    3   CC  165182   NaN     CCDE      True
    4   CC  260039   NaN      NaN     False
    5   CC   49740   XYZ      NaN      True
    6   CC  260041   NaN      NaN     False
    7   CC  259653   NaN      NaN     False
    

    在这里,获得相同效果的另一种方法是通过~df[['renal', 'dialisis']].isnull().all(axis=1) 一次将isnull 应用于两列。

    如果您真的更喜欢使用 0 和 1:

    In [71]: df['survived'] = df['survived'].astype(int)
    
    In [72]: df
    Out[72]:
      Tipo  Número renal dialisis  survived
    0   CC  260037   NaN      NaN         0
    1   CC  260037   NaN      AAB         1
    2   CC  165182   NaN      NaN         0
    3   CC  165182   NaN     CCDE         1
    4   CC  260039   NaN      NaN         0
    5   CC   49740   XYZ      NaN         1
    6   CC  260041   NaN      NaN         0
    7   CC  259653   NaN      NaN         0
    

    【讨论】:

    • 很好的解释。我希望更多的熊猫答案是这样的!
    • 除上述内容外,我认为重复调用set 意味着应该删除重复项。将此答案与简单的df.groupby("Numero").survived.max() 一起使用即可实现此目的。
    • @coffeinjunky:不确定这是不是你的意思,但set(set(np.array([np.nan, np.nan]))) 有两个元素。
    • 这只是对操作的评论,而不是对您的解决方案的评论。查看原始代码,看起来他/她希望每个患者 ID(数字)一行作为结果,而不是(如书面)每原始行一行。我可能错了。只是想指出他/她如何实现这一目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2019-10-18
    • 2019-07-22
    • 2013-06-18
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多