2017-09-12 160 views
1

所以,我有一個文本文件,我已經變成了一個數據幀。我基本上只是試圖繞過H和Z列中的每個值,將它們平方,然後取平方根(換句話說,就是畢達哥拉斯定理)。 I.E.for循環從數據幀計算

F = sqrt(H**2 + Z**2). 

我的數據:(它已變成了熊貓後數據幀)

H  D  Z 
0 3235  6764 9546 
1 1667  3455 7776 
2 3555  3564 5433 
3 2344  3333 8777 
4 5666  3334 4444 

這就是數據的一小片段。這裏有大約1000行數據。

代碼:

import pandas as pd 

#load data: 

df=pd.read_table('example_data.txt', sep='\s+') 

from math import sqrt 
for x,y in df: 
    F=sqrt(H**2+Z**2) 
    print(F) 

產生的誤差:

ValueError        Traceback (most recent call last) 
<ipython-input-34-1b1be5be91d0> in <module>() 
     1 from math import sqrt 
    ----> 2 for x,y in df: 
     3  F=sqrt(H**2+Z**2) 
     4  print(F) 
     5 

     ValueError: too many values to unpack (expected 2) 

所以這是它。這是一個容易產生的問題,但是Python初學者似乎無法解決這個問題。它基本上用2個變量重複計算多次。我已經與1個可變看到它,但並不是2.

任何幫助將不勝感激,

乾杯!

+0

什麼是'X,y'在for循環? ps:你可能想要檢查數據框上的apply/applymap方法 – pazqo

回答

2

您應該使用numpy到vectorise此:

In[11]: 
df['F'] = np.sqrt(df['H']**2 + df['Z']**2) 
df 

Out[11]: 
     H  D  Z    F 
0 3235 6764 9546 10079.252998 
1 1667 3455 7776 7952.676593 
2 3555 3564 5433 6492.727778 
3 2344 3333 8777 9084.605935 
4 5666 3334 4444 7200.881335 

關於你的錯誤,從DataFrame返回的迭代是列:

for col in df: 
    print(col) 

H 
D 
Z 
F 

因此錯誤,遍歷行你使用iterrows

from math import sqrt 
for x,y in df.iterrows(): 
    F=sqrt(y['H']**2+y['Z']**2) 
    print(F) 

10079.252998114493 
7952.676593449529 
6492.72777806062 
9084.605935317173 
7200.881334947827 

,但對於簡單的算術運算,您應該避免循環並尋找矢量化解決方案,如numpy,它會比數據大小增加時循環和縮放更快。

+0

太棒了!非常感謝,這真的很有用。對不起,也遲到了。 – Matthew

2

在Pandas/Numpy/SciPy中,我們總是喜歡矢量化解決方案,因爲它們速度更快,看起來更好,代碼看起來更乾淨,更簡潔。

所以儘量使用numpy.linalg.norm(),而不是循環的:

In [34]: df['res'] = np.linalg.norm(df[['H','Z']], axis=1) 

In [35]: df 
Out[35]: 
     H  D  Z   res 
0 3235 6764 9546 10079.252998 
1 1667 3455 7776 7952.676593 
2 3555 3564 5433 6492.727778 
3 2344 3333 8777 9084.605935 
4 5666 3334 4444 7200.881335 
+0

我覺得這是正確的形式+1 – EdChum

+0

@EdChum,謝謝:) – MaxU

+0

這是(或者)正確的方式來完成任務,是的,但答案本身似乎沒有任何幫助,因爲實際上回答OP的問題。 –

2

在列標籤遍歷一個迭代DataFrame(如默認dict迭代器遍歷鍵)。要遍歷行,您需要iterrows或更可取的itertuples

迭代非常令人沮喪,雖然它很慢。

此操作是很容易做到逐列,所以迭代是沒有必要的

(df['H']**2 + df['Z']**2).pow(.5)