我有两个数据帧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
如何在不合并两个数据帧的情况下实现这一点?
我不能合并数据帧,因为没有公共键,而且因为我需要基于条件的行数,我不能在任何临时列上加入数据帧,因为我需要避免交叉连接。
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
如果你的数据帧太大,你可以使用笛卡尔连接和过滤来完成:
(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的记录的联接结果
groupby
StartDate和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,并且