如何在完整数据框中应用 def 函数?

How to apply def function in full dataframe?

我需要帮助来更正该功能。我对两件事感到困惑。

  1. 如何将for循环放入def函数中。
  2. 请更正我的其他功能。它仅适用于单列
raw_data = {'age1': [23,45,21],'age2': [10,20,50]}
df = pd.DataFrame(raw_data, columns = ['age1','age2'])
df

效果很好。

l = list(df.columns)
for c in l:
  df[c]=np.where(df[c]>45,df[c]+100,df[c])
  1. 它不能正常工作并且增加了超过100的价值。这里有什么问题。
def fun(x):
  l = list(df.columns)
  for c in l:
    df[c]=np.where(df[c]>45,df[c]+100,df[c])
  return x
df.apply(fun)
  1. 为什么我不能在完整的数据帧上应用这个函数。请更正...
def f(x):
  val=[]
  if x>=40:
      val = x+100
  else:
      val = x
  return val
df.apply(f,axis=1)

函数做不同的事情。

第一个选项有效,因为您遍历每一列并对每一列应用一次 np.where。

for c in df.columns:
    df[c] = np.where(df[c] > 45, df[c] + 100, df[c])

df:

   age1  age2
0    23    10
1    45    20
2    21   150

在这种情况下:

def fun(x):
  l = list(df.columns)
  for c in l:
    df[c]=np.where(df[c]>45,df[c]+100,df[c])
  return x
df.apply(fun)

为每一列调用函数 fun(通过 apply),但您每次都在执行完整的操作。

这大致相当于:

for _ in df.columns:
    for c in df.columns:
        df[c] = np.where(df[c] > 45, df[c] + 100, df[c])

注意嵌套循环。

因此它产生 df:

   age1  age2
0    23    10
1    45    20
2    21   250

最后一个选项是close:

def f(x):
  val=[]
  if x>=40:
      val = x+100
  else:
      val = x
  return val

df.apply(f,axis=1)

但是 x 是一系列值(DataFrame 列),这意味着 x >= 40 不起作用导致错误:

ValueError: The truth value of a Series is ambiguous. 
Use a.empty, a.bool(), a.item(), a.any() or a.all().

并且可以稍作修改以使用 applymap 将函数应用于 DataFrame 中的每个单元格:

def f(x):
    if x > 45:  # Changed the bound to match the np.where condition
        val = x + 100
    else:
        val = x
    return val

df = df.applymap(f)

df:

   age1  age2
0    23    10
1    45    20
2    21   150

然而,这里更 pandas 的方法是使用类似 DataFrame.mask:

的方法
df = df.mask(df > 45, df + 100)

df:

   age1  age2
0    23    10
1    45    20
2    21   150

根据列类型填充和替换 nan 列值

df.transform(lambda x: x.fillna('') if x.dtype == 'float64' else x.float64(0))

df.transform(lambda x: x.replace('orange','juice') if x.dtype == 'object' else x.fillna(0))