【问题标题】:pandas dataframe function using != np.nan never follows false path使用 != np.nan 的熊猫数据框函数从不遵循错误路径
【发布时间】:2021-12-29 16:33:28
【问题描述】:

我有以下数据框:

             recordhigh  recordlow
no_year                       
01-01           NaN        NaN
01-02           NaN        NaN
01-03           NaN        NaN
01-04           NaN        NaN
01-05           NaN      -15.5
01-06           NaN        NaN
01-07           NaN        NaN
01-08           NaN        NaN
01-09           NaN        NaN
01-10           NaN        NaN
01-11           NaN      -20.0
01-12           NaN        NaN
01-13           NaN        NaN
01-14           NaN        NaN
01-15           NaN        NaN
01-16           NaN        NaN
01-17           NaN        NaN
01-18           NaN        NaN
01-19           NaN        NaN
01-20           NaN        NaN
01-21           NaN        NaN
01-22           NaN        NaN
01-23           NaN        NaN
01-24           NaN        NaN
01-25           NaN        NaN
01-26           NaN        NaN
01-27           NaN        NaN
01-28           NaN        NaN
01-29           NaN        NaN
01-30           NaN        NaN
...             ...        ...
12-02           NaN        NaN
12-03           NaN        NaN
12-04           NaN        NaN
12-05           NaN        NaN
12-06           NaN        NaN
12-07          10.0        NaN
12-08          10.0        NaN
12-09          12.2        NaN
12-10          15.0        NaN
12-11          15.6        NaN
12-12          20.0        NaN
12-13          19.4        NaN
12-14          18.3        NaN
12-15          16.1        NaN
12-16          15.0        NaN
12-17           NaN        NaN
12-18           NaN        NaN
12-19           NaN        NaN
12-20           NaN        NaN
12-21           NaN        NaN
12-22           NaN        NaN
12-23          18.3        NaN
12-24          17.2        NaN
12-25          11.1        NaN
12-26          11.7        NaN
12-27           NaN        NaN
12-28           NaN        NaN
12-29           NaN        NaN
12-30           NaN        NaN
12-31           NaN        NaN

当它们不是 NaN 时,我想保持最高记录和最低记录。即,我想要一个包含所有记录高数字、所有记录低数字和 NaN 的列,以防两者都是 NaN。 我有以下代码可以应用函数:

def keep2015record(row):
    if row['recordhigh']!=np.nan:
        row['record']=row['recordhigh']
    else:
        row['record']=row['recordlow']
    return row

我将它应用到我的数据框:

df2015record=df2015record.apply(keep2015record,axis='columns')

我只得到一个保持记录高的数据框:

             recordhigh  recordlow  record
no_year                               
01-01           NaN        NaN     NaN
01-02           NaN        NaN     NaN
01-03           NaN        NaN     NaN
01-04           NaN        NaN     NaN
01-05           NaN      -15.5     NaN
01-06           NaN        NaN     NaN
01-07           NaN        NaN     NaN
01-08           NaN        NaN     NaN
01-09           NaN        NaN     NaN
01-10           NaN        NaN     NaN
01-11           NaN      -20.0     NaN
01-12           NaN        NaN     NaN
01-13           NaN        NaN     NaN
01-14           NaN        NaN     NaN
01-15           NaN        NaN     NaN
01-16           NaN        NaN     NaN
01-17           NaN        NaN     NaN
01-18           NaN        NaN     NaN
01-19           NaN        NaN     NaN
01-20           NaN        NaN     NaN
01-21           NaN        NaN     NaN
01-22           NaN        NaN     NaN
01-23           NaN        NaN     NaN
01-24           NaN        NaN     NaN
01-25           NaN        NaN     NaN
01-26           NaN        NaN     NaN
01-27           NaN        NaN     NaN
01-28           NaN        NaN     NaN
01-29           NaN        NaN     NaN
01-30           NaN        NaN     NaN
...             ...        ...     ...
12-02           NaN        NaN     NaN
12-03           NaN        NaN     NaN
12-04           NaN        NaN     NaN
12-05           NaN        NaN     NaN
12-06           NaN        NaN     NaN
12-07          10.0        NaN    10.0
12-08          10.0        NaN    10.0
12-09          12.2        NaN    12.2
12-10          15.0        NaN    15.0
12-11          15.6        NaN    15.6
12-12          20.0        NaN    20.0
12-13          19.4        NaN    19.4
12-14          18.3        NaN    18.3
12-15          16.1        NaN    16.1
12-16          15.0        NaN    15.0
12-17           NaN        NaN     NaN
12-18           NaN        NaN     NaN
12-19           NaN        NaN     NaN
12-20           NaN        NaN     NaN
12-21           NaN        NaN     NaN
12-22           NaN        NaN     NaN
12-23          18.3        NaN    18.3
12-24          17.2        NaN    17.2
12-25          11.1        NaN    11.1
12-26          11.7        NaN    11.7
12-27           NaN        NaN     NaN
12-28           NaN        NaN     NaN
12-29           NaN        NaN     NaN
12-30           NaN        NaN     NaN
12-31           NaN        NaN     NaN

请问我做错了什么? 我也尝试过 if, elif, else 但我得到了相同的结果。 谢谢

【问题讨论】:

  • 保持标题专注于特定问题——“初学者问题”和类似的标签不是必需的。如果可以的话,最好用更具体的问题描述来代替“无法正常工作”;我将尝试为此进行编辑。
  • 你想要的结果是什么?您是否尝试有条件地将新列分配给现有列的非 NA?还是您要过滤数据框?
  • 我想要一个包含所有记录高数字、所有记录低数字和 NaN 的列,以防两者都是 NaN
  • 注意:我的 pandas 版本上没有 pandas.notna(obj)

标签: python pandas dataframe if-statement


【解决方案1】:

您好,我猜您正在尝试保留“recordhigh”或“recordlow”不是 nan 的记录。

在这种情况下,您可以简单地使用:

df_either_nonans=df[df['recordhigh'].notna() | df['recordlow'].notna() ]
print(df)

结果:

     noyear recordhigh recordlow
4   01-mag        NaN     -15.5
10  01-nov        NaN       -20
30     ...        ...       ...
36  12-lug         10       NaN
37  12-ago         10       NaN
38  12-set       12.2       NaN
39  12-ott         15       NaN
40  12-nov       15.6       NaN
41  12-dic         20       NaN
42  dic-13       19.4       NaN
43  dic-14       18.3       NaN
44  dic-15       16.1       NaN
45  dic-16         15       NaN
52  dic-23       18.3       NaN
53  dic-24       17.2       NaN
54  dic-25       11.1       NaN
55  dic-26       11.7       NaN

如果您只想保留两者都不是 nan 的记录,则只需替换为“|”带“&”:

df_both_nonans=df[df['recordhigh'].notna() & df['recordlow'].notna() ]

【讨论】:

  • 这不是我解释 OP 目标的方式——据我了解,他们想添加一个包含 recordhigh 或 recordlow 的 record 列;问题是,在他们的实现中,它永远不会包含来自recordlow 的值。我不明白他们的目标是删除任何行;虽然他们使用“保留”一词,但我理解其实际意图是“填充 record”——否则现有代码将没有意义。
  • 没错,查尔斯
  • Gabriele,你的代码,我有一个 AttributeError: 'Series' object has no attribute 'notna'
猜你喜欢
  • 2021-12-11
  • 2013-07-06
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多