2015-09-24 44 views
0

我有如下excel工作表設置:列值和列標題iteraton計算

avgdegf | 50 | 55| 60| 65| 70| 75| 80 | 

76  | 

68  | 

39  | 

注:值下的值50,55,60,65,70,75,和80是空的。

我所試圖實現的是基於填充關閉該列中的數值,這些數值。所以如果avgdegf值比特定列的(標題號)大於do(avgdegf-header number),則其值爲0,並將該值放在特定行中。

avgdegf | 50 | 55| 60| 65| 70| 75| 80 | 

76  | 26 |21 |16 |11 | 6 | 1 | 0 | 

68  | 18 |13 | 8 |11 | 0 | 0 | 0 | 

39  | 0 |0 | 0 | 0 | 0 | 0 | 0 | 

這上面是我希望得到的,而是我只是得到:

Python: ValueError: The Truth Value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 

什麼我做錯了,我該如何解決這一問題?謝謝!

這裏是我下面的代碼塊:

df_avgdegf = df["avgdegf"] 
x=50 
for x in range(50, 81): 

     if df_avgdegf > x: 
       df[x]= (df_avgdegf)-x 
     else: 
       df[x]=0 

     df.head() 

     df_cdd = df[x] 
     df_cdd = pd.DataFrame(df_cdd) 



     writer = ExcelWriter('thecddhddtestque.xlsx') 
     df.to_excel(writer,'Sheet1',index=False) 
     writer.save() 
     x += 1 
+0

行'if df_avgdegf> x'是直接的問題,因爲您正在測試一個布爾數組,它可能包含true和false的混合值。看起來你會遇到其他問題時,雖然這是固定的。例如,'df [x] =(df_avgdegf)-x'沒有意義,因爲您將一系列的值設置爲另一系列的值,這是無意義的。 –

+0

你知道我如何去使用dfs進行這些計算嗎?有什麼建議麼?我嘗試了多種方法來達到這個目的。 – Techno04335

+0

請參閱[我應該在標題中使用標籤嗎?](http://meta.stackexchange.com/help/tagging)。 – pnuts

回答

0

我認爲在CSV文件中的數據。 如果您使用的是excel閱讀器,則適用相同的原則。

data.csv:

avgdegf,50,55,60,65,70,75,80 
76,,,,,, 
68,,,,,, 
39,,,,,, 

讓您的數據轉換成數據幀:

df = pd.read_csv('data.csv') 

所以你的DF看起來就像這樣:

avgdegf 50 55 60 65 70 75 80 
0  76 nan nan nan nan nan nan nan 
1  68 nan nan nan nan nan nan nan 
2  39 nan nan nan nan nan nan nan 

下一個步驟,這種代碼將做的伎倆:

# we want to get the numerical columns into the dataframe 
df.iloc[0,1:] = df.columns[1:] 
df = df.fillna(method ='ffill') 

df =df.astype(np.float64) # cast type for next steps 

df.iloc[:,1:] = df.iloc[:,1:].sub(df['avgdegf'],axis='index') # 1.) see http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.subtract.html 
df.iloc[:,1:] = df.iloc[:,1:].applymap(lambda x: 0 if x > 0 else x) # 2.) set positve values to zero 
df.iloc[:,1:] = df.iloc[:,1:].applymap(np.abs) # 3.) since we went reverse we now take np.abs() 
df.set_index('avgdegf',inplace=True) 

主要生產:

  50 55 60 65 70 75 80 
avgdegf        
76  26 21 16 11 6 1 0 
68  18 13 8 3 0 0 0 
39  0 0 0 0 0 0 0 
+0

當我嘗試實現這個代碼,我得到的錯誤:「無法將字符串轉換爲float:avgdegf」 – Techno04335

+0

我有點困惑,因爲到在你提供的代碼是「如果avgdegf值大於計算(標題號)的特定列比做(avgdegf標題號)其他值爲0「發生在?謝謝! – Techno04335

+0

因此,這些步驟發生在3行代碼中,並且在我調用.sub()時開始。這是.subtract()的縮寫。請參閱:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.subtract.html。它分三步走。 1.)爲了簡單起見,我做相反的減法(標題號 - avgdegf)2.)將*正值*設置爲零3.)現在取絕對值np。abs() – Dickster

0

這也許是更清晰的語法和演示numpy的涼爽的 「廣播」。最終結果與其他答案相同。

df = pd.read_csv('data.csv') 

df.fillna(1,inplace=True) 
print df.head() 
df = df.astype(np.int) 

b = df.iloc[:,1:].values 
a = df.columns[1:].values.astype(int) 

print a.shape 
print b.shape 

print a*b 
print df['avgdegf'].values 
print df['avgdegf'].values[:,np.newaxis] 


method1 = (a*b) - df['avgdegf'].values[:,np.newaxis] 
#or 
method2 = ((a*b).T - df['avgdegf'].values).T 


df.iloc[:,1:] = method1 

#df.iloc[:,1:] = df.iloc[:,1:].applymap(lambda x : np.abs(0) if x > 0 else np.abs(x)) 
#OR 
df.iloc[:,1:] = df.iloc[:,1:].clip_upper(0).abs()