使用 lambda (pd.DataFrame) 的逐元素运算
Element-wise operation with lambda (pd.DataFrame)
正在尝试使用 lambda 从 DatraFrame 中减去常量数组。
这是我的 DataFrame d
:
import pandas as pd
d = pd.DataFrame()
d['x'] = pd.Series([1, 2, 3, 4, 5, 6])
d['y'] = pd.Series([11, 22, 33, 44, 55, 66])
按预期工作的经典循环方法:
transformed = pd.DataFrame(columns=('x', 'y'))
for index, row in d.iterrows():
transformed.loc[index] = [row[0] + 5, row[1] + 10]
print(transformed)
生产:
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
这是 lambda
版本:
print(d.apply(lambda x: x + [5, 10]))
但是,正在引发错误:ValueError: operands could not be broadcast together with shapes (6,) (2,)
阅读 Pandas documentation 后,我明白我的 lambda 方法应该有效。为什么它不起作用?
apply
自动按列显示,axis
参数默认设置为 0。
您需要指定 axis=1
因为它将按行计算:
>>> d.apply(lambda x: x + [5, 10], axis=1)
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
>>>
但是在这种情况下你根本不需要 apply
:
>>> d + [5, 10]
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
>>>
如果列数与列表长度相同,最简单的是:
print(d + [5, 10])
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
如果列表有多个列select,列表的长度必须相同:
print(d[['x','y']] + [5, 10])
正在尝试使用 lambda 从 DatraFrame 中减去常量数组。
这是我的 DataFrame d
:
import pandas as pd
d = pd.DataFrame()
d['x'] = pd.Series([1, 2, 3, 4, 5, 6])
d['y'] = pd.Series([11, 22, 33, 44, 55, 66])
按预期工作的经典循环方法:
transformed = pd.DataFrame(columns=('x', 'y'))
for index, row in d.iterrows():
transformed.loc[index] = [row[0] + 5, row[1] + 10]
print(transformed)
生产:
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
这是 lambda
版本:
print(d.apply(lambda x: x + [5, 10]))
但是,正在引发错误:ValueError: operands could not be broadcast together with shapes (6,) (2,)
阅读 Pandas documentation 后,我明白我的 lambda 方法应该有效。为什么它不起作用?
apply
自动按列显示,axis
参数默认设置为 0。
您需要指定 axis=1
因为它将按行计算:
>>> d.apply(lambda x: x + [5, 10], axis=1)
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
>>>
但是在这种情况下你根本不需要 apply
:
>>> d + [5, 10]
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
>>>
如果列数与列表长度相同,最简单的是:
print(d + [5, 10])
x y
0 6 21
1 7 32
2 8 43
3 9 54
4 10 65
5 11 76
如果列表有多个列select,列表的长度必须相同:
print(d[['x','y']] + [5, 10])