我正在尝试在进行以下数据操作时理解特定结果。我在一个大的私有数据集上注意到这一点,并且无法在较小的虚拟数据集上复制它。尽管如此,我已经包含了下面的代码。
摘要(使代码更易于阅读)
1:我有一个事务级数据框
2:我在此数据名称上定义了交易级别标准
3:然后我通过将数据框与来自另一个数据操作(来自同一数据帧)的结果合并来调整数据框
4:我将事务级别标准应用于datafarme
5:我对某些字段进行分组,然后重置索引。
问题是如果我改变步骤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。
最后一步:
df[slt][crit1].groupby(grp).aggregate(sum).reset_index()
在两个序列中生成2个不同大小的数据帧。我试图加入两个序列的最后一步,看看序列1中存在哪些行而不是序列2,但两者之间的左合并没有显示任何差异。
我非常确定在使用合并调整数据框之后定义标准是正确的方法,但我想理解为什么如果除了添加之外的基础事务级别数据框架中没有任何更改,结果会有所不同新专栏。
有没有人遇到类似的问题,或者可以解释一下这个问题?如果这个解释不清楚,请告诉我,我可以尽可能详细说明。
更新:
我想我可能已经弄明白了。文档提到,无论何时在列上添加列,都将忽略索引 。在通过左连接进行合并之后,合并后的数据帧与左数据帧的pandas生成的索引不匹配,尽管大小相同。
由于在连接具有原始索引之前定义了布尔索引,因此将该条件应用于合并后的数据帧会导致不匹配错误。
我的错误是认为左数据帧的索引在左连接后保持不变。 我相信这是答案,但我会不加思索地保留这个问题,万一有人可以提供更多的见解。将在第二天左右自己正式回答。
感谢。