所以这是我正在尝试做的类似情况
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)
答案 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
以逐列进行操作。