Python 如何选择数据帧的特定列,并根据条件求和?

Python 如何选择数据帧的特定列,并根据条件求和?,python,pandas,Python,Pandas,这是一个类似的情况,我正在尝试做什么 data = pd.read_csv(data) df = pd.DataFrame(data) print(df) 数据框如下所示 ... 'd1' 'd2' 'd3... 'd13' 0 ... 0 0 0... 0 1 ... 0 0.95 0... 0 2 ... 0 0.95 0.95... 0 以此类推,本质上我想选择数据帧的最后13列,计算每行有多少列大于某个值,

这是一个类似的情况,我正在尝试做什么

data = pd.read_csv(data)
df = pd.DataFrame(data)
print(df)
数据框如下所示

    ... 'd1' 'd2' 'd3... 'd13'
 0  ...   0    0    0...   0
 1  ...   0    0.95    0...   0
 2  ...   0    0.95    0.95...  0
以此类推,本质上我想选择数据帧的最后13列,计算每行有多少列大于某个值,然后将其附加到数据帧中

我想一定有一个简单的方法,我一直在尝试使用
df.iloc[:,21:://code>作为我感兴趣的第一列文章的开始,但是从这一点开始,我感到卡住了。我一直在尝试许多不同的方法,例如
标准
和for循环。我知道这是一件小事,但我已经为此花了好几个小时。任何帮助都将不胜感激

for x in df:
    a = df.iloc[:,21:].values()
    if a.any[:, 12] > 0.9:
        a[x] = 1
    else:
        a[x] = 0
sumdi = sum(a)
df.append(sumdi)

我相信您需要将最后选择的
13
列与(
)进行比较,按
sum
计算
True
值并转换为整数:

df['new'] = df.iloc[:,-13:].gt(0.9).sum(axis=1).astype(int)
样本

np.random.seed(12)
df = pd.DataFrame(np.random.rand(10, 6))

#compare last 3 columns for > 0.5
df['new'] = df.iloc[:,-3:].gt(.5).sum(axis=1).astype(int)
print (df)
          0         1         2         3         4         5  new
0  0.154163  0.740050  0.263315  0.533739  0.014575  0.918747    2
1  0.900715  0.033421  0.956949  0.137209  0.283828  0.606083    1
2  0.944225  0.852736  0.002259  0.521226  0.552038  0.485377    2
3  0.768134  0.160717  0.764560  0.020810  0.135210  0.116273    0
4  0.309898  0.671453  0.471230  0.816168  0.289587  0.733126    2
5  0.702622  0.327569  0.334648  0.978058  0.624582  0.950314    3
6  0.767476  0.825009  0.406640  0.451308  0.400632  0.995138    1
7  0.177564  0.962597  0.419250  0.424052  0.463149  0.373723    0
8  0.465508  0.035168  0.084273  0.732521  0.636200  0.027908    2
9  0.300170  0.220853  0.055020  0.523246  0.416370  0.048219    1
使用
apply
很慢,因为发动机罩下有环:

np.random.seed(12)
df = pd.DataFrame(np.random.rand(10000, 20))

In [172]: %timeit df['new'] = df.iloc[:,-13:].gt(0.9).sum(axis=1).astype(int)
3.46 ms ± 91.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [173]: %timeit df['new'] = df[df.columns[-13:]].apply(lambda x: x > .9, axis=1).sum(axis=1)
1.57 s ± 5.26 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

是的,您需要应用行函数

# Select subset of columns
cols = df1.iloc[:, -13:].columns
# Create new column based on conditions that value is greater than 1
df1['new'] = df1[cols].apply(lambda x: x > 1, axis=1).sum(axis=1)
在引擎盖下,这与@jezrael answer的做法相同,只是语法略有不同<代码>gt()
将被应用的lambda替换。这只是为逻辑更复杂的其他条件/情况提供了稍微更大的灵活性


注意:
axis=1
是确保每行应用函数的重要条件。您可以更改为
axis=0
以逐列执行

太棒了!!及+1@pygo-谢谢!我可能在这里遗漏了一些东西,我该如何把它带到我的索引中,以便它在每一行中迭代,它似乎在第一行中运行,但只是在所有行中重复该值。@VictorNogueira-不要使用它,因为它非常慢。。。在pandas中,最好避免所有循环,如果存在,只使用矢量化的解决方案。@jezrael我非常感谢您的帮助。成功了!我花了很长时间试着这么做。我应该在这里发布。谢谢,非常感谢。