Python根据布尔条件和合并来描述奇怪的Groupby行为

2024-09-29 17:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在执行以下数据操作时,我试图理解一个特定的结果。我在一个大型的私有数据集上注意到了这一点,但无法在较小的虚拟数据集上复制它。尽管如此,我还是包含了下面的代码。在

摘要(使代码更易于阅读)

  1. 具有事务级数据帧
  2. 在此数据帧上定义事务级别条件
  3. 将数据帧与另一个数据操作(来自同一个数据帧)的结果合并
  4. 将事务级别条件应用于数据帧
  5. groupby某些字段,然后重置索引。在

问题是,如果我切换步骤2和步骤3的顺序,步骤5之后返回的行数不同。在

代码如下:

顺序1:

#1:  The dataset
df = rawdf.copy()

#2:  Define the Criteria
c1 = (df.year == '2000')
c2 = (df.personid != '12345')
c3 = (df.tallflag != 'T' )
c4 = (df.wealthyflag != 'B')
c5 = (df.freefood != 'F')
c6 = (df.duplicaterecord == 'N')
c7 = (df.match == 'Y')
c8 = (df.nbrpets != 0)
c9 = (df.dollars != 0)

critorder = c1 & c2 & c3 & c4 & c5 & c6 & c7 & c8 & c9
legitnames = ['bob','dan','mike','horatio']
critnames = (df.firstname.isin(legitnames))
legitcountycode = ['a','b','c','d']
critcode = (df.countycode.isin(critcode))

crit1 = critorder & critnames & critcode

#3:  Adjust the dataframe via a merge
yearspresent = df.groupby('person').apply(lambda x: \
';'.join(x['year'].order(ascending=True).drop_duplicates())).reset_index()
yearspresent.columns = ['parentnbr','yearspresent']
df = df.merge(yearspresent, how='left', on ='parentnbr')

#4 & 5:  Apply the criteria, then groupby
slctfields = ['year','firstname','lastname','city','state','country', \
'parentorg', 'dollars', 'nbrpets']
grp = ['year','firstname','lastname','city','state','country','parentorganization']

df[slt][crit1].groupby(grp).aggregate(sum).reset_index()

序列2:与序列1相同,但切换了步骤2和3。在

最后一步:

^{pr2}$

在两个序列中生成2个不同大小的数据帧。我尝试连接两个序列的最后一步,以查看序列1中存在哪些行,而不是序列2中的行,但是这两个序列之间的左合并没有显示任何差异。在

我很确定在使用merge调整dataframe之后定义条件是正确的方法,但是我想理解为什么在底层事务级数据帧中除了添加一个新列之外没有任何变化,结果会有所不同。在

有没有人遇到过类似的问题,或者可以说明这一点?如果这个解释不清楚,请告诉我,我可以尽可能详细说明。在


解决方案:

我想我可能已经知道了。文档提到,每当连接列上的列时,索引将被忽略。通过左连接合并后,后合并数据帧与熊猫生成的左数据帧索引不匹配,尽管大小相同。在

由于在联接具有原始索引之前定义布尔索引,因此将该条件应用于合并后的数据帧会导致不匹配错误。在

我的错误是认为左数据帧的索引是在左连接之后维护的。 我很有信心这是答案,但我将不考虑这个问题,以防有人能提供更多的见解。我会在第二天左右正式回答。在


Tags: the数据代码df定义步骤序列merge

热门问题