Pandas Data-Frame:有条件地选择列

时间:2017-03-05 16:26:25

标签: python pandas

我有一个pandas数据框,如下所示......

   C1  C2   C3     C4
0  -1   -3   3   0.75
1  10   20  30  -0.50 

我想只添加每行中前两列的值小于零的列。例如,我将针对上述情况得到的系列如下......

   CR
0  -4
1  0

我知道如何应用下面的其他功能......

df.iloc[:, :-2].abs().sum(axis = 1)

有没有办法使用lambda函数?

1 个答案:

答案 0 :(得分:2)

您似乎需要ilocwheresum进行选择:

df = df.iloc[:,:2].where(df < 0).sum(axis=1)
print (df)
0   -4.0
1    0.0
dtype: float64

如果需要selection by callable的解决方案:

df = df.iloc[:, lambda df: [0,1]].where(df < 0).sum(axis=1)
print (df)
0   -4.0
1    0.0
dtype: float64

lambda中的python功能也适用于此。

lambda in pandas

#sample data
np.random.seed(100)
df = pd.DataFrame(np.random.randint(10, size=(5,5)), columns=list('ABCDE'))
print (df)
   A  B  C  D  E
0  8  8  3  7  7
1  0  4  2  5  2
2  2  2  1  0  8
3  4  0  9  6  2
4  4  1  5  3  4

按行.apply(axis=0)获取差异,默认值为.apply()

#instead function f1 is possible use lambda, if function is simple
print (df.apply(lambda x: x.max() - x.min()))
A    8
B    8
C    8
D    7
E    6
dtype: int64

def f1(x):
    #print (x)
    return x.max() - x.min()

print (df.apply(f1))
A    8
B    8
C    8
D    7
E    6
dtype: int64

按列.apply(axis=1)

获取差异
#instead function f2 is possible use lambda, if function is simple
print (df.apply(lambda x: x.max() - x.min(), axis=1))
0    5
1    5
2    8
3    9
4    4
dtype: int64

def f2(x):
    #print (x)
    return x.max() - x.min()

print (df.apply(f2, axis=1))
0    5
1    5
2    8
3    9
4    4
dtype: int64