lambda 不是 'nan' 的数据框中一列中的每一行

lambda each row in a column from dataframe that is not 'nan'

在下面的代码中,我如何为非“nan”、“null”或换句话说为空白的行迭代 lambda?

输出仍然附加“.pdf”到空白行。

    model1      model2    model3     
 0  File1.pdf   File3.pdf File2.pdf
 1  File2.pdf   nan.pdf   File2.pdf
 2  File3.pdf   nan.pdf   File2.pdf
model_types = []
for col in df.columns:
    model_types.append(col)
    df[col] = df[col].apply(lambda x: f"{x}.pdf" if x != 'nan' else x)  # this part

首先将您的 nans 转换为 None

df1 = df.where(pd.notnull(df), None)
for col in df1:
    df1[col].apply(lambda x: f"{x}.pdf" if x else None)

如果您有真正的 NaN,您应该能够直接添加“.pdf”以矢量化方式,这应该不会影响 NaN。

model_types = []
for col in df.columns:
    model_types.append(col)
    df[col] += '.pdf'

或者,您也可以使用:

model_types = list(df)
df = df.stack().add('.pdf').unstack()
# or
df = df.apply(lambda s: s+'.pdf')

输出:

      model1     model2     model3
0  File1.pdf  File3.pdf  File2.pdf
1  File2.pdf        NaN  File2.pdf
2  File3.pdf        NaN  File2.pdf

对于那些想要更“通用”的解决方案的人,您可以处理:

  • 0 和 整数
  • 浮点数数字
  • pd.NA = <不适用>
  • np.nan = NaN

正在创建 DF:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Col1':[0,"File2",1.23], 'Col2':["File1",pd.NA,"File3"], 'Col3':["File1","File2",np.nan]})
df
index Col1 Col2 Col3
0 0 File1 File1
1 File2 <NA> File2
2 1.23 File3 NaN
df1 = df.applymap(lambda x: x+'.pdf' if type(x) == str else x, na_action='ignore')
df1
index Col1 Col2 Col3
0 0 File1.pdf File1.pdf
1 File2.pdf <NA> File2.pdf
2 1.23 File3.pdf NaN