Pandas 逐行映射器
Pandas row-wise mapper
Pandas 是否包含一个简单的方法来一次将映射器应用于每一行?
例如:
import pandas as pd
df = pd.DataFrame(
[[j + (3*i) for j in range(3)] for i in range(4)],
columns=['a','b','c']
)
print(df)
a b c
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
然后应用一些映射器(伪代码)
df_ret = df.rowmap(lambda d: d['a'] + d['c'])
print(df_ret)
0
0 2
1 8
2 14
3 20
请注意,添加数字并不是这里的重点。关键是要有一个按行映射器。
您可以使用 apply
和参数 axis=1
:
df_ret = df.apply(lambda d: d['a'] + d['c'], axis=1)
print(df_ret)
0 2
1 8
2 14
3 20
dtype: int64
但使用矢量化解决方案更快:
print (df.a + df.c)
0 2
1 8
2 14
3 20
print (df.a.add(df.c))
0 2
1 8
2 14
3 20
dtype: int64
print (df[['a','c']].sum(axis=1))
0 2
1 8
2 14
3 20
dtype: int64
dtype: int64
最快的解决方案:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.add.html 因为它是内部优化的
Pandas 是否包含一个简单的方法来一次将映射器应用于每一行?
例如:
import pandas as pd
df = pd.DataFrame(
[[j + (3*i) for j in range(3)] for i in range(4)],
columns=['a','b','c']
)
print(df)
a b c
0 0 1 2
1 3 4 5
2 6 7 8
3 9 10 11
然后应用一些映射器(伪代码)
df_ret = df.rowmap(lambda d: d['a'] + d['c'])
print(df_ret)
0
0 2
1 8
2 14
3 20
请注意,添加数字并不是这里的重点。关键是要有一个按行映射器。
您可以使用 apply
和参数 axis=1
:
df_ret = df.apply(lambda d: d['a'] + d['c'], axis=1)
print(df_ret)
0 2
1 8
2 14
3 20
dtype: int64
但使用矢量化解决方案更快:
print (df.a + df.c)
0 2
1 8
2 14
3 20
print (df.a.add(df.c))
0 2
1 8
2 14
3 20
dtype: int64
print (df[['a','c']].sum(axis=1))
0 2
1 8
2 14
3 20
dtype: int64
dtype: int64
最快的解决方案:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.add.html 因为它是内部优化的