2015-09-08 57 views
1

我有一個大約100,000行和1,000列的df,需要根據現有數據進行一些調整。我如何最好地解決這個問題?大部分的變化將遵循這個基本公式:循環遍歷列和調整值大熊貓

  1. 搜索欄(或兩個或三個),看看是否滿足條件
  2. 如果滿足,改變該行數十個列的值或數百

這是我最好的嘗試,在這裏我創建了列的列表,並正在查看第一列是否包含值1.在那裏,我只想添加一些數字。這部分工作,但它只在第一行,而不是列中的所有1。爲了解決這個問題,我想我需要創建一個循環,我有第二個[i]遍歷所有行,但我不確定是否我錯誤地處理了整個問題。 FWIW,test_cols =列的列表,testing_2是我的df。

 def try_this(test_cols): 
     for i in range(len(test_cols)): 
      if i == 0 and testing_2[test_cols[i]][i] == 1:    
       testing_2[test_cols[i]][i]=testing_2[test_cols[i]][i]+78787 
     i+=1 
     return test_cols 

編輯/例如:

 Year Month Mean_Temp 
City 

Madrid 1999 Jan  7--this value should appear twice  
Bilbao 1999 Jan  9--appear twice 
Madrid 1999 Feb  9 
Bilbao 1999 Feb  10 
.  .  .  . 
.  .  .  . 
.  .  .  . 
Madrid 2000 Jan  6.8--this value should go away 
Bilbao 2000 Jan  9.2--gone 

所以我需要做這樣的事情(使用您的答案):通過創建一個功能,你可以做到這一點

def alter(row): 
    if row['Year'] == 2000 and row['Month'] == 'Jan': 
     row['Mean_Temp'] = row['Mean_Temp'] #from year 1999! 
     return row['Mean_Temp'] 
    else: 
     return row['Mean_Temp'] 
+1

一個好的解決方案取決於您希望執行的條件和計算的*細節*。例如,'if i == 0'條件意味着'for-loop'只在第一次迭代時纔會做一些不重要的事情。所以你真的不需要'for-loop'。另外,爲什麼在'for-loop'之外增加'i'?爲什麼返回'test_cols'如果它永遠不會被修改? – unutbu

+0

@unutbu從whys開始:這可能是我修改了我在這裏找到並在以前使用過的groupby.apply函數中的一些代碼的結果。詳細信息將始終採用通用格式:'如果year = x'或'if year = x和month = y',其中year和month是DF中的列。計算的公式更少,更像小班:將年份= x和月份= y的100列中的值替換爲來自這些相同列但不同年份和月份的值。 – user2891518

回答

1

的一種方法是並應用它。假設如果'a'或'b'中的對應行是偶數,則想要將列'c'增加10倍。

import pandas as pd 

data = {'a':[1,2,3,4],'b':[3,6,8,12], 'c':[1,2,3,4]} 
df = pd.DataFrame(data) 

def alter(row): 
    if row['a']%2 == 0 or row['b']%2 == 0: 
     return row['b']*10 
    else: 
     return row['b'] 

df['c'] = df.apply(alter, axis=1) 

將創建一個DF看起來像,

a b c 
0 1 3 3 
1 2 6 60 
2 3 8 80 
3 4 12 120 

編輯補充: 如果你想從DF的其他部分適用值,你可以把那些在一個字典,然後傳遞進入你的應用功能。

import pandas as pd 

data = {'Cities':['Madrid', 'Balbao'] * 3, 'Year':[1999] * 4 + [2000] * 2, 
     'Month':['Jan', 'Jan', 'Feb', 'Feb', 'Jan', 'Jan'], 
     'Mean_Temp':[7, 9, 9, 10, 6.8, 9.2]} 

df = pd.DataFrame(data) 
df = df[['Cities', 'Year', 'Month', 'Mean_Temp']] 

#create dicitonary with the values from 1999 
edf = df[df.Year == 1999] 
keys = zip(edf.Cities, edf.Month) 
values = edf.Mean_Temp 
dictionary = dict(zip(keys, values)) 


def alter(row, dictionary): 
    if row['Year'] == 2000 and row['Month'] == 'Jan': 
     return dictionary[(row.Cities, row.Month)] 
    else: 
     return row['Mean_Temp'] 

df['Mean_Temp'] = df.apply(alter, args = (dictionary,), axis=1) 

它給你DF看起來像,

Cities Year Month Mean_Temp 
0 Madrid 1999 Jan   7 
1 Balbao 1999 Jan   9 
2 Madrid 1999 Feb   9 
3 Balbao 1999 Feb   10 
4 Madrid 2000 Jan   7 
5 Balbao 2000 Jan   9 

當然你也可以改變,只要你喜歡的參數。希望這可以幫助。

+0

我認爲這應該工作,但無法弄清楚如何讓它爲我的問題工作。在這個例子中,如果我保持條件相同,但不是將b乘以10,我希望從另一行返回b的值 - 比如說a = 1 - 在c列中只剩下3。 – user2891518

+0

我想說的是:row ['b'] = row ['b'] where row ['a'] == 1。這是可能的還是有更好的方法? – user2891518

+0

我對你想要做的事情有點不清楚。你可以給你的問題添加一個具體的例子數據框,你想做什麼? – rurp