我正在尝试对我的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)
答案 0 :(得分:1)
DataFrame
构造函数是可能的,1,1
和0,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.apply的result_type
参数。仅当您在apply
(DataFrame)上使用df
函数而不是df.a
(Series)
df[['b', 'c']] = df.apply(lambda row: compute_b_c(row['a']), result_type='expand', axis=1)