逐行解析数据

时间:2019-07-18 06:56:46

标签: python pandas for-loop

我有一个数据框,其中有5列,分别为“ 0”,“ 1”,“ 2”,“ 3”,“ 4”

small_pd
Out[53]: 
          0     1     2     3     4 
0      93.0  94.0  93.0  33.0   0.0  
1      92.0  94.0  92.0  33.0   0.0 
2      92.0  93.0  92.0  33.0   0.0  
3      92.0  94.0  20.0  33.0  76.0 

我想使用上面的按行输入来提供执行以下操作的函数。我以第一行和第二行为例

第一行:

takeValue[0,0]-takeValue[0,1]+takeValue[0,2]-takeValue[0,3]+takeValue[0,4]

第二行:

   takeValue[1,0]-takeValue[1,1]+takeValue[1,2]-takeValue[1,3]+takeValue[1,4]

从第三行开始,然后将所有结果分配为一列。

small_pd['extracolumn']

有没有一种方法可以避免python中典型的for循环并以一种更好的方式做到这一点?

可以请教我吗? 非常感谢 亚历克斯

2 个答案:

答案 0 :(得分:1)

您可以使用pd.apply

df = pd.DataFrame(data={"0":[93,92,92,92],
                   "1":[94,94,93,94],
                   "2":[93,92,92,20],
                   "3":[33,33,33,33],
                   "4":[0,0,0,76]})

def calculation(row):
    return row["0"]-row["1"]+row["2"]-row["3"]+row["4"]


df['extracolumn'] = df.apply(calculation,axis=1)
print(df)
    0   1   2   3   4  result
0  93  94  93  33   0      59
1  92  94  92  33   0      57
2  92  93  92  33   0      58
3  92  94  20  33  76      61

答案 1 :(得分:0)

不要使用apply,因为在引擎盖下循环很慢。

通过用DataFrame.iloc进行索引来获取成对和不成对的列,对其求和,然后减去以进行矢量化,因此是一种快速的解决方案:

small_pd['extracolumn'] = small_pd.iloc[:, ::2].sum(1) - small_pd.iloc[:, 1::2].sum(1)
print (small_pd)
      0     1     2     3     4  extracolumn
0  93.0  94.0  93.0  33.0   0.0         59.0
1  92.0  94.0  92.0  33.0   0.0         57.0
2  92.0  93.0  92.0  33.0   0.0         58.0
3  92.0  94.0  20.0  33.0  76.0         61.0

验证

a = small_pd.iloc[0,0]-small_pd.iloc[0,1]+small_pd.iloc[0,2]-
    small_pd.iloc[0,3]+small_pd.iloc[0,4]
b = small_pd.iloc[1,0]-small_pd.iloc[1,1]+small_pd.iloc[1,2]-
    small_pd.iloc[1,3]+small_pd.iloc[1,4]
print (a, b)
59.0 57.0