在执行以下数据操作时,我试图理解一个特定的结果。我在一个大型的私有数据集上注意到了这一点,但无法在较小的虚拟数据集上复制它。尽管如此,我还是包含了下面的代码。在
摘要(使代码更易于阅读)
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之后定义条件是正确的方法,但是我想理解为什么在底层事务级数据帧中除了添加一个新列之外没有任何变化,结果会有所不同。在
有没有人遇到过类似的问题,或者可以说明这一点?如果这个解释不清楚,请告诉我,我可以尽可能详细说明。在
我想我可能已经知道了。文档提到,每当连接列上的列时,索引将被忽略。通过左连接合并后,后合并数据帧与熊猫生成的左数据帧索引不匹配,尽管大小相同。在
由于在联接具有原始索引之前定义布尔索引,因此将该条件应用于合并后的数据帧会导致不匹配错误。在
我的错误是认为左数据帧的索引是在左连接之后维护的。 我很有信心这是答案,但我将不考虑这个问题,以防有人能提供更多的见解。我会在第二天左右正式回答。在
目前没有回答
相关问题 更多 >
编程相关推荐