Pandas - 计算每个输入行的函数行数

时间:2018-04-09 06:14:16

标签: python pandas

我有一个需要添加一列的数据框。该列需要是表中满足特定条件的所有其他行的计数,该条件需要从“输入”行和“输出”行接收输入。

例如,如果它是一个描述人物的数据框,我想制作一个列,计算有多少人比当前行更轻,更轻。

我想要一行的高度和重量,以及函数中其他行的高度和重量,所以我可以这样做:

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:修复错误

3 个答案:

答案 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

<强>解释

对于每行比较值和仅计数sumTrue

答案 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。为了爱上帝,使用公制系统来表示体重和身高,并转换为任何表现形式。这些数字对于世界人口来说完全没有意义。 :)