熊猫数据框适用于多列

时间:2020-03-24 06:47:23

标签: pandas dataframe

我正在尝试对我的DataFrame使用apply函数。 Apply使用一个自定义函数,该函数返回2个值,并且需要在DataFrame上填充2列的行。

我在下面放一个简单的例子:

df = DataFrame ({'a' : 10})

我希望创建两列:b和c。 如果a大于0,则b等于1。 如果a大于0,则c等于1。

def compute_b_c(a):
   if a > 0:
      return 1, 1
   else:
      return 0,0

我尝试了此操作,但它返回关键错误:

df[['b', 'c']] = df.a.apply(compute_b_c)

2 个答案:

答案 0 :(得分:1)

DataFrame构造函数是可能的,1,10,0就像元组(1,1)(0,0)一样:

df = pd.DataFrame ({'a' : [10, -1, 9]})

def compute_b_c(a):
   if a > 0:
      return (1,1)
   else:
      return (0,0)

df[['b', 'c']] = pd.DataFrame(df.a.apply(compute_b_c).tolist())
print (df)
    a  b  c
0  10  1  1
1  -1  0  0
2   9  1  1

性能

#10k rows
df = pd.DataFrame ({'a' : [10, -1, 9] * 10000})

In [79]: %timeit df[['b', 'c']] = pd.DataFrame(df.a.apply(compute_b_c).tolist())
22.6 ms ± 285 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [80]: %timeit df[['b', 'c']] = df.apply(lambda row: compute_b_c(row['a']), result_type='expand', axis=1)
5.25 s ± 84.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

答案 1 :(得分:0)

使用pandas.DataFrame.applyresult_type参数。仅当您在apply(DataFrame)上使用df函数而不是df.a(Series)

时适用
df[['b', 'c']] = df.apply(lambda row: compute_b_c(row['a']), result_type='expand', axis=1)