我正在尝试迭代多列行并将第 n 行乘以 n+1 行,然后添加列。
我尝试了下面的代码并且运行良好。
还有其他简单的方法可以同时实现减法和乘法部分吗?
import pandas as pd
df = pd.DataFrame({'C': ["Spark","PySpark","Python","pandas","Java"],
'F' : [2,4,3,5,4],
'D':[3,4,6,5,5]})
df1 = pd.DataFrame({'C': ["Spark","PySpark","Python","pandas","Java"],
'F': [1,2,1,2,1],
'D':[1,2,2,2,1]})
df = pd.merge(df, df1, on="C")
df['F_x-F_y'] = df['F_x'] - df['F_y']
df['D_x-D_y'] = df['D_x'] - df['D_y']
for index, row in df.iterrows():
df['F_mul'] = df['F_x-F_y'].mul(df['F_x-F_y'].shift())
df['D_mul'] = df['D_x-D_y'].mul(df['D_x-D_y'].shift())
df['F+D'] = df['F_mul'] + df['D_mul']
输出 -
C F_x D_x F_y D_y F_x-F_y D_x-D_y F_mul D_mul F+D
0 Spark 2 3 1 1 1 2 NaN NaN NaN
1 PySpark 4 4 2 2 2 2 2.0 4.0 6.0
2 Python 3 6 1 2 2 4 4.0 8.0 12.0
3 pandas 5 5 2 2 3 3 6.0 12.0 18.0
4 Java 4 5 1 1 3 4 9.0 12.0 21.0
首先通过删除迭代
iterrows
,然后可以通过以下方式简化广义解:另一个想法是将所有列一起处理 - 优点是不需要指定要处理的列:
您可以完全删除遍历行的迭代。您的代码不会在循环内执行任何特定于行的操作
iterrows()
——也不会index
使用任何row
值。结果就是,您最终会在每次迭代中重新计算整个列(F_mul 和 D_mul)。例子
你真的不应该在熊猫中使用循环
iterrows
。您想要做的事情可以通过向量实现。您不应该将键C作为列,而应该将其作为索引,以利用索引的自动对齐:
你甚至可以将所有内容作为单个表达式(sub 除外):
输出:
如果你不需要中间的
_sub
/_mul
列,这会更简单:或者:
输出: