如何检查pandas dataframe列对另一列的值,并在第三列中操作该值

时间:2017-05-23 14:38:01

标签: python pandas dataframe

我有一个pandas数据帧

dfcolour:

     A      B      C       D     E
0   red     0     redy     1    red
1   blue    1     bluey    2    bluey
2   green   0     greeny   0    greenz

我想检查E列中的值,并将它们与A列和A列进行比较。 C.如果E中的值与同一行中A的值匹配,那么我想增加B中的值,如果它与同一行中C的值匹配,那么我将增加D中的值,如果它没有& #39; t匹配任何一个,我想创建2个新列F& G,其中F表示新字符串,G表示整数列,从0开始递增

新的dfcolour将如下所示:

     A      B      C       D     E       F        G
0   red     1     redy     1    red               0
1   blue    1     bluey    3    bluey             0
2   green   0     greeny   0    greenz   greenz   1

是否可以在不进行迭代的情况下执行此操作?

创建数据框的代码:

dfObject = pd.DataFrame()
dfObject.set_value(1, 'A', 'red')
dfObject.set_value(1, 'B', 0)
dfObject.set_value(1, 'C', 'redy')
dfObject.set_value(1, 'D', 1)
dfObject.set_value(1, 'E', 'red')
dfObject.set_value(2, 'A', 'blue')
dfObject.set_value(2, 'B', 1)
dfObject.set_value(2, 'C', 'bluey')
dfObject.set_value(1, 'D', 2)
dfObject.set_value(1, 'E', 'bluey')
dfObject.set_value(3, 'A', 'green')
dfObject.set_value(3, 'B', 0)
dfObject.set_value(3, 'C', 'greeny')
dfObject.set_value(1, 'D', 0)
dfObject.set_value(1, 'E', 'greenz')

2 个答案:

答案 0 :(得分:3)

您可以创建这些条件并使用AE = df.A == df.E CE = df.C == df.E df['B'] += AE # if A == E, add one to B df['D'] += CE # if C == E, add one to D df['F'] = pd.np.where(~(AE|CE), df.E, '') # else create F df['G'] = pd.np.where(~(AE|CE), 1, 0) # else create G ​ df # A B C D E F G #0 red 1 redy 1 red 0 #1 blue 1 bluey 3 bluey 0 #2 green 0 greeny 0 greenz greenz 1 构建新列:

{{1}}

答案 1 :(得分:0)

很抱歉,我的第一个想法是进行一种迭代:你可以apply DataFrame行的函数,并返回一列或多列。这通常是我的方式。它仍然在迭代,但比使用iterrows更好“。”

def special_function(row):
    b = row['B']
    d = row['D']
    f = None
    g = 0
    if row['E'] == row['A']:
        b = b + 1
    elif row['E'] == row['C']:
        d = d + 1
    else:
        f = row['E']
        g = 1
    return pandas.Series({ 'B':b, 'D':d, 'F': f, 'G': g })

dfcolour[['B', 'D', 'F', 'G']] = dfcolour.apply(special_function, axis=1)