2017-01-31 42 views
0

我仍然是Python的noob,所以如果答案顯而易見,我表示歉意......我有一些類似於此的數據框(簡單示例):Python:如果列中的第n個值滿足一定條件,則對整個列執行計算

 0  1  2  3  
0  2  1  1  1 
1  3  2  2  2 
2  4  3  3  3 
3  2  4  4  0 

說我需要先檢查是否上每隔一列第4行大於1,如果是,則通過2減去整列的結果應該是這樣的:

 0  1  2  3  
0  0  1  1  1 
1  1  2  2  2 
2  2  3  3  3 
3  0  4  4  0 

在這個例子中,代碼應該檢查列中的第4個值(row3) 0和2大於1,因爲由於列0符合要求,所以整列減去2,而列2被忽略。

我目前有:

for flist in glob('*.csv'): 
    print(flist) 
    df = pd.read_csv(flist, delimiter = ',', header=None, index_col=False, skiprows=29, usecols=range(3,72)) 
    if df.loc[3,0::2] > 1: 
     df.loc[:,0::2]-2 
    if df.loc[3,0::2] < -1: 
     df.loc[:,0::2]+2 

可能有其他的東西不對的代碼,但是有,當我嘗試運行它,我得到

一個系列的真值是開始曖昧。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

任何幫助,將不勝感激。

+0

我認爲你需要一點在其列,需要從減去2的條件更加具體。它是第一行中第一列的值大於1的列嗎?非常具體。 –

回答

0

你可以遍歷做到這一點在一行中執行檢查和減法。

df.loc[:,((df.columns % 2 == 0) & (df.loc[3,:] > 1))] -= 2 

這裏df.loc[:, condition]按列上的條件過濾DataFrame。
condition實際上兩個條件:

  1. 我們只想每隔一列((df.columns % 2 == 0)), 以及(&
  2. 只有那些列在第四行中的項是大於1( (df.loc[3,:] > 1))

通過使用-= 2從過濾的DataFrame減去2。

請注意,我們只選擇每第二列的方式起作用,因爲我們沒有在DataFrame中指定任何頭。如果有頭部,可以使用例如(numpy.arange(len(df.columns)) % 2 == 0)

下面是完整的代碼:

import pandas as pd 

a =[[2 , 1 , 1 , 1], 
    [3 , 2 , 2 , 2], 
    [4 , 3 , 3 , 3], 
    [2 , 4 , 4 , 0]] 
df = pd.DataFrame(a) 

df.loc[:,((df.columns % 2 == 0) & (df.loc[3,:] > 1))] -= 2 
print df 
# 0 1 2 3 
#0 0 1 -1 1 
#1 1 2 0 2 
#2 2 3 1 3 
#3 0 4 2 0 
0

表達式df.loc[3,0::2]讓你在列表中的每一個備用列,並試圖獲得一組數字的真值是沒有意義的。

如果您試圖比較列表中的多個值,則必須單獨對其進行檢查。像

if df.loc[3][0] > 1 and df.loc[3][2] > 1: 

也是東西,我不認爲你可以在表達式中增加一整列,則需要通過列的每個元素

for I in range(0,5): 
    df.loc[3][i]=df.loc[3][i]+1 
+0

謝謝你的回覆。有沒有更有效的方法來執行檢查?我發佈的示例是一個簡化版本,我的數據表有大約80列,我是否必須爲其他列添加40條if語句? – Raku

相關問題