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

时间:2018-11-14 10:11:04

标签: 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列,并计算每行大于某个值的数量,然后将其附加到数据帧中。

我认为必须有一种简单的方法,在我感兴趣的第一列从这里开始时,我一直在尝试使用df.iloc[:, 21:],但是从现在开始,我感到很困惑。我一直在尝试许多不同的方法,例如criteria和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)

2 个答案:

答案 0 :(得分:5)

我认为您需要将iloc选择的最后13列与gt>)进行比较,将True的值按sum进行计数,然后转换为整数:

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)

答案 1 :(得分:1)

是的,您将需要应用逐行函数。

# 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答案相同,只是语法略有不同。 gt()被替换为已应用的lambda。这样只会为您的逻辑更加复杂的其他条件/情况提供更多的灵活性。

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