列值和列标题迭代计算

时间:2015-09-24 12:28:52

标签: python excel pandas

我有一个Excel工作表设置如下:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这可能是更清晰的语法,并演示了酷"广播"笨拙的。最终与其他答案的结果相同。

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()