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我非常感谢您的帮助。成功了!我花了很长时间试着这么做。我应该在这里发布。谢谢,非常感谢。