使用另一个df计算一个df的多个col中值的条件出现

时间:2019-08-26 20:23:49

标签: python-3.x pandas numpy

我有2个数据框;第一个df_data看起来像这样:

A   B   C
-----------------
0   0   1
1   4   1
1   10  1
2   8   1
2   9   1
3   7   1
3   4   0
4   8   1
5   8   1
6   7   1
9   17  1
9   13  1

...

所需的输出(df_output)如下:

Day Zt  Zr
-----------------
1   2   0
2   4   0
3   5   1
4   6   1
5   6   0
6   7   0
7   7   0
8   5   0
9   5   0
10  5   0
11  5   0
12  6   0

...

基本上,我创建了一个新的数据框(df_output),其中仅填充了Days,它表示给定月份的每一天。我一直在尝试根据以下条件来计算df_data中值的出现次数(这些条件实际上不起作用,因为它是从不同的df中提取的):

df_output['Zt'] = (df_data['A'] <= df_output['Day']) & (df_data['B'] >= df_output['Day']) & (df_data['C'] == 1).count()

df_output['Zr'] = (df_data['A'] <= df_output['Day']) & (df_data['B'] >= df_output['Day']) & (df_data['C'] == 0).count()

以更易读的格式计算Zt和Zr的逻辑是(如果是函数):

def countZt():
   for each day in df_output['Day']:
   Zt = 0
      for each row in df_data:
         if (df_data['A'] <= day) and (df_data['B'] >= day) and (df_data['C'] == 1):
            Zt = Zt + 1
   return Zt

def countZr():
   for each day in df_output['Day']:
   Zr = 0
      for each row in df_data:
         if (df_data['A'] <= day) and (df_data['B'] >= day) and (df_data['C'] == 0):
            Zr = Zr + 1
   return Zr

您可以看到Zt和Zr之间的唯一区别是,一个计数的是布尔(C)为True的那个,另一个计数的是False。

我在本主题中发现的资源仅指导如何在同一数据框内进行条件设置,但是缺乏/缺乏资源表明如何使用一个数据框的值来计数另一个数据框。向我指出正确方向的任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:1)

我们可以在进行比较之前重塑形状,如下所示:

cond = (df.A.values<=df_output.Day[:,None])&(df.B.values>=df_output.Day[:,None])
df_output.assign(Zt = cond.dot(df.C),Zr = cond.dot(1-df.C))
    Day  Zt  Zr
0     1   2   0
1     2   4   0
2     3   5   1
3     4   6   1
4     5   6   0
5     6   7   0
6     7   7   0
7     8   5   0
8     9   4   0
9    10   3   0
10   11   2   0
11   12   2   0