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

Vic*_*ira 2 python pandas

所以这是我想要做的类似情况

data = pd.read_csv(data)
df = pd.DataFrame(data)
print(df)
Run Code Online (Sandbox Code Playgroud)

数据框如下所示

    ... 'd1' 'd2' 'd3... 'd13'
 0  ...   0    0    0...   0
 1  ...   0    0.95    0...   0
 2  ...   0    0.95    0.95...  0
Run Code Online (Sandbox Code Playgroud)

所以依此类推,基本上我想选择数据框的最后13列,并计算每行的数量大于某个值,然后将其附加到我的数据框.

我认为必须有一个简单的方法,我一直试图使用,df.iloc[:, 21:]因为我的第一列兴趣从这里开始,但从这一点开始,我感到卡住了.我一直在尝试许多不同的方法,比如criteriafor和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)
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 5

我相信您需要比较with ()13选择的最后一列,计算值和转换为整数:ilocgt>Truesum

df['new'] = df.iloc[:,-13:].gt(0.9).sum(axis=1).astype(int)
Run Code Online (Sandbox Code Playgroud)

样品:

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
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)