【问题标题】:Pandas Data-Frame : Conditionally select columnsPandas Dataframe:有条件地选择列
【发布时间】:2017-07-25 10:50:24
【问题描述】:

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

   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 函数?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    看来您需要通过iloc 选择wheresum

    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
    

    python 中的 lambda 函数在这里也适用。

    熊猫中的 lambda

    #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
    

    【讨论】:

    • 我需要的是 .where 子句。我不明白 lambda 语法 - 你能指出一些好的资源吗?谢谢。
    • 熊猫中的 lambda - 我找不到一些不错的资源。 :(
    • 我尝试添加一些带有 lambda 函数的示例,希望对您有所帮助。
    • 嗨,我不想提出另一个问题,因为 stackoverflow 会将其标记为重复。但是为什么对于由两列 id(range(1,7) 和 sex(M/F) 组成的数据框的 df.iloc[:,lambda x:x.sex=='M'] 不起作用。它给我 NotImplementedError: 基于 iLocation 的整数类型的布尔索引不可用
    • yeaaaahhhh 工作......哇,这太疯狂了......这不起作用 a.iloc[:,lambda x : (x.sex=='M').values] 但这确实.iloc[lambda x : (x.sex=='M').values]...当我添加行切片时,它会返回每一行..当我不添加时,它只会返回男性行
    猜你喜欢
    • 2016-10-06
    • 2015-03-22
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2017-09-23
    • 2013-08-14
    • 2016-07-16
    相关资源
    最近更新 更多