当前位置: 首页 > 知识库问答 >
问题:

在不合并数据帧的情况下比较两个数据帧的列

郭阳曜
2023-03-14

我有两个数据帧DF1和DF2。

DF1:

StartDate

1/1/2013
2/1/2013
11/1/2014
4/1/2014
5/1/2015

DF2:

EmploymentType        EmpStatus           EmpStartDate

Employee              Active              11/5/2012
Employee              Active              9/10/2012
Employee              Active              10/15/2013
Employee              Active              10/29/2013
Employee              Terminated          10/29/2013
Contractor            Terminated          11/20/2014
Contractor            Active              11/20/2014

我需要来自DF2的行数,其中EmploymentType='Employee',EmpStatus='Active',EmpStartDate

输出:

Start Date    Count

1/1/2013      2
2/1/2013      2
11/1/2014     4
4/1/2014      4
5/1/2015      4

如何在不合并两个数据帧的情况下实现这一点?

我不能合并数据帧,因为没有公共键,而且因为我需要基于条件的行数,我不能在任何临时列上加入数据帧,因为我需要避免交叉连接。

共有2个答案

南宫正阳
2023-03-14
def compensation(x):
return DF2[DF2['EmpStartDate']<x
 and  DF2['EmpStatus']=='Active'].shape[0]

DF1['Count']=DF1['StartDate']
       .apply(lambda x:  
                   compensation(x),axis=1)

方法是布尔索引和计数行。https://pandas.pydata.org/pandas-docs/stable/indexing.html

徐文彬
2023-03-14

如果你的数据帧太大,你可以使用笛卡尔连接和过滤来完成:

(df1.assign(key=1)
   .merge(df2.query('EmploymentType == "Employee" and EmpStatus=="Active"').assign(key=1), 
          on='key')
   .query('EmpStartDate <= StartDate')
   .groupby('StartDate')['key'].count())

输出:

StartDate
2013-01-01    2
2013-02-01    2
2014-04-01    4
2014-11-01    4
2015-05-01    4
Name: key, dtype: int64
  • 使用query过滤df2,将EmploymentType和EmpStatus分别包含为Employee和Active
  • 为每个数据帧分配一个伪键,并对伪键使用merge,以创建所有记录的笛卡尔连接
  • 使用query仅筛选EmpStartDate小于或等于StartDate的记录的联接结果
  • 最后,groupbyStartDate和count

另外,请注意,使用查询是一种快捷方式。如果列名包含特殊字符或空格,则需要使用布尔索引筛选数据帧。

pd.merge_asof(df2.query('EmploymentType == "Employee" and EmpStatus == "Active"').sort_values('EmpStartDate'), 
              df1.sort_values('StartDate'), 
              left_on='EmpStartDate', 
              right_on='StartDate', 
              direction='forward')\
  .groupby('StartDate')['EmploymentType'].count()\
  .reindex(df1.StartDate.sort_values())\
  .cumsum()\
  .ffill()

输出:

StartDate
2013-01-01    2.0
2013-02-01    2.0
2014-04-01    4.0
2014-11-01    4.0
2015-05-01    4.0
Name: EmploymentType, dtype: float64

详情:

>

  • 使用pd。merge_asof将df2过滤器向下加入到df1,直到最近的前瞻性日期。

    从df1加入的开始日期和计数。

  •  类似资料:
    • 我有两个数据帧,DF1和DF2,DF1是存储来自DF2的任何附加信息的主机。 假设DF1是以下格式, DF2包含DF1中已经存在的2个条目和两个新条目。(itemId和item被视为一个组,可以被视为连接的键) 我需要合并两个数据框,以便增加现有项目计数并插入新项目。 结果应该是这样的: 我有一种方法可以做到这一点,但不确定这种方法是否有效或正确

    • 我有两个不同列数和行数的CSV文件。第一个CSV文件有M列和N行,第二个文件有H列和G行。一些列具有相同的名称。 null 另外,如果两个CSV文件有两个数据帧,并希望这样做,例如,如果我将第一个CSV加载到中,将第二个加载到中,然后希望合并到,类似于上面的示例。

    • 我有两个数据帧,希望比较它们并返回第一个数据帧(df1)中不在第二个数据帧(df2)中的行。我找到了一种比较它们并返回差异的方法,但无法找出如何只返回df1中缺失的部分。

    • 我有两个数据帧。示例: 每个数据帧都有日期作为索引。两个数据帧具有相同的结构。 我想做的是比较这两个数据帧,找出df2中哪些行不在df1中。我想比较日期(索引)和第一列(香蕉、苹果等),看看它们是否存在于df2和df1中。 我尝试了以下方法: 两个熊猫数据帧并排输出差异-突出差异 比较两个熊猫数据帧的差异 对于第一种方法,我得到这个错误:"异常:只能比较相同标记的DataFrame对象"。我尝试删

    • 我有两个数据帧 我希望将它们合并到一个数据帧中,以便在两个数据帧中都存在键的情况下只考虑行: 如果我使用pandas.merge,我总是得到重复的行。有没有一个简单的方法来实现这一点?

    • 我肯定错过了一些简单的东西。尝试合并熊猫中的两个数据帧,它们的列名基本相同,但右边的数据帧有一些左边没有的列,反之亦然。 我已尝试使用外部联接进行联接: 但这会产生: 我还指定了一个要连接的列(例如,on="id"),但这会重复所有列,除了"id",如attr_1_x、attr_1_y,这并不理想。我还传递了整个列列表(有很多)到on: 其产生: 我错过了什么?我想得到一个附加了所有行的df,并且