我有一个需要添加一列的数据框。该列需要是表中满足特定条件的所有其他行的计数,该条件需要从“输入”行和“输出”行接收输入。
例如,如果它是一个描述人物的数据框,我想制作一个列,计算有多少人比当前行更轻,更轻。
我想要一行的高度和重量,以及函数中其他行的高度和重量,所以我可以这样做:
def example_function(height1, weight1, height2, weight2):
if height1 > height2 and weight1 < weight2:
return True
else:
return False
它只是总结所有的真实并在列中给出这个总和。
这样的事情可能吗?
提前感谢任何想法!
编辑:示例输入:
id name height weight country
0 Adam 70 180 USA
1 Bill 65 190 CANADA
2 Chris 71 150 GERMANY
3 Eric 72 210 USA
4 Fred 74 160 FRANCE
5 Gary 75 220 MEXICO
6 Henry 61 230 SPAIN
结果必须是:
id name height weight country new_column
0 Adam 70 180 USA 1
1 Bill 65 190 CANADA 1
2 Chris 71 150 GERMANY 3
3 Eric 72 210 USA 1
4 Fred 74 160 FRANCE 4
5 Gary 75 220 MEXICO 1
6 Henry 61 230 SPAIN 0
我认为它需要某种功能,因为我需要使用的实际逻辑更复杂。
编辑2:修复错误
答案 0 :(得分:2)
您可以添加布尔值,如下所示:
count = ((df.height1 > df.height2) & (df.weight1 < df.weight2)).sum()
编辑:
我测试了一下然后用自定义函数改变条件:
def f(x):
#check boolean mask
#print ((df.height > x.height) & (df.weight < x.weight))
return ((df.height < x.height) & (df.weight > x.weight)).sum()
df['new_column'] = df.apply(f, axis=1)
print (df)
id name height weight country new_column
0 0 Adam 70 180 USA 2
1 1 Bill 65 190 CANADA 1
2 2 Chris 71 150 GERMANY 3
3 3 Eric 72 210 USA 1
4 4 Fred 74 160 FRANCE 4
5 5 Gary 75 220 MEXICO 1
6 6 Henry 61 230 SPAIN 0
<强>解释强>:
对于每行比较值和仅计数sum
值True
。
答案 1 :(得分:1)
例如,如果它是一个描述人物的数据框,我想制作一个列,计算有多少人比当前行更轻,更轻。
据我了解,您想要分配一个类似
的新列df['num_heigher_and_leighter'] = df.apply(lambda r: ((df.height > r.height) & (df.weight < r.weight)).sum(), axis=1)
但是,您的文字说明似乎与结果不符,即:
0 2
1 3
2 0
3 1
4 0
5 0
6 6
dtype: int64
修改强>
与任何其他情况一样,您可以使用命名函数而不是lambda:
df = ...
def foo(r):
return ((df.height > r.height) & (df.weight < r.weight)).sum()
df['num_heigher_and_leighter'] = df.apply(foo, axis=1)
答案 2 :(得分:0)
我假设你有一个拼写错误,想要将高度与高度和权重与权重进行比较。如果是这样,你可以计算更高的 OR 更重的人数:
>>> for i,height,weight in zip(df.index,df.height, df.weight):
... cnt = df.loc[((df.height>height) & (df.weight>weight)), 'height'].count()
... df.loc[i,'thing'] = cnt
...
>>> df
name height weight country thing
0 Adam 70 180 USA 2.0
1 Bill 65 190 CANADA 2.0
2 Chris 71 150 GERMANY 3.0
3 Eric 72 210 USA 1.0
4 Fred 74 160 FRANCE 1.0
5 Gary 75 220 MEXICO 0.0
6 Henry 61 230 SPAIN 0.0
例如,没有人比亨利更重,没有人比加里更高。如果这不符合您的意图,则应该很容易将上面的&
修改为|
,或者将>
转换为<
。< / p>
如果您更习惯于Pandas,我建议您使用Ami Tavory优秀的answer代替。
PS。为了爱上帝,使用公制系统来表示体重和身高,并转换为任何表现形式。这些数字对于世界人口来说完全没有意义。 :)