pandas if then语句没有循环

时间:2014-09-25 15:23:10

标签: python if-statement pandas dataframe

我想要做的就是在同一行data1 data2中添加lettersa列,如果c则减去b }}。如果它是import pandas as pd a=[['Date', 'letters', 'data1', 'data2'], ['1/2/2014', 'a', 6, 1], ['1/2/2014', 'a', 3, 1], ['1/3/2014', 'c', 1, 3],['1/3/2014', 'b', 3, 5]] df = pd.DataFrame.from_records(a[1:],columns=a[0]) df['result']=df['data1'] for i in range(0,len(df)): if df['letters'][i]=='a': df['result'][i]=df['data1'][i]+df['data2'][i] if df['letters'][i]=='b': df['result'][i]=df['data1'][i]*df['data2'][i] if df['letters'][i]=='c': df['result'][i]=df['data1'][i]-df['data2'][i] >>> df Date letters data1 data2 result 0 1/2/2014 a 6 1 7 1 1/2/2014 a 3 1 4 2 1/3/2014 c 1 3 -2 3 1/3/2014 b 3 5 15 则为multipy。这是我的代码。

df['result']=df['result'].map(lambda x:df['data1'][i]+df['data2'][i] if x =='a' df['data1'][i]-df['data2'][i] elif x =='c' else x)`

我的问题:有没有办法在没有循环的情况下在一行中完成?对于精神的一些东西:

{{1}}

2 个答案:

答案 0 :(得分:1)

您可以将df.apply与lambda函数结合使用。您必须使用关键字参数axis=1来确保您处理行而不是列。

import pandas as pd

a=[['Date', 'letters', 'data1', 'data2'], ['1/2/2014', 'a', 6, 1], ['1/2/2014', 'a', 3, 1], ['1/3/2014', 'c', 1, 3]]
df = pd.DataFrame.from_records(a[1:],columns=a[0])

from operator import add, sub, mul

d = dict(a=add, b=mul, c=sub)

df['result'] = df.apply(lambda r: d[r['letters']](r['data1'], r['data2']), axis=1)

这将使用字典d来获取您要使用的功能(addsubmul)。

以下原始解决方案

df['result'] = df.apply(lambda r: r['data1'] + r['data2'] if r['letters'] == 'a' 
                        else r['data1'] - r['data2'] if r['letters'] == 'c' 
                        else r['data1'] * r['data2'], axis=1)

print(df)
       Date letters  data1  data2  result
0  1/2/2014       a      6      1       7
1  1/2/2014       b      3      1       3
2  1/3/2014       c      1      3      -2

lambda函数现在有点复杂,所以我将更详细地介绍它...

lambda函数使用一个所谓的三元运算符在一行内部制作布尔条件,典型的三元表达形式为

a if b else c

很遗憾,你不能拥有带有三元表达式的elif,但你可以做的是在else语句中添加另一个,然后它变为

a if b else c if d else e

答案 1 :(得分:1)

您可以使用.where方法:

where(cond, other=nan, inplace=False, axis=None, level=None, try_cast=False, raise_on_error=True) method of pandas.core.series.Series instance
  

返回一个与self相同形状的对象,其对应的条目来自self,其中cond为True,否则来自其他。

如:

>>> df['data1'] + df['data2'].where(df['letters'] == 'a', - df['data2'])
0    7
1    4
2   -2
dtype: int64

或者,numpy.where

>>> df['data1'] + np.where(df['letters'] == 'a', 1, -1) * df['data2']
0    7
1    4
2   -2
dtype: int64