循环遍历列并调整值pandas

时间:2015-09-08 17:59:48

标签: python pandas

我有一个大约100,000行和1,000列的df,需要根据现有数据进行一些调整。我该如何最好地接近这个?大多数更改将遵循以下基本公式:

  1. 搜索一个列(或两个或三个)以查看是否满足条件
  2. 如果符合,则更改该行中数十或数百列的值
  3. 这是我最好的尝试,在那里我创建了一个列列表,并且正在查看第一列是否包含值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 个答案:

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

会创建一个看起来像的

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

编辑添加: 如果你想从df的其他部分应用值,你可以将它们放在dict中,然后将它传递给你的apply函数。

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

当然,您可以随意更改参数。希望这会有所帮助。