我正在尝试进行一些计算。效果很好:
import pandas
import numpy
print(pandas.__version__) #=> 0.25.2
columns = ['CUR', 'ISSUER_INDUSTRY', 'PROFIT']
data = [
{'CUR': 'NOK', 'ISSUER_INDUSTRY': 'BANK', 'PROFIT': 10},
{'CUR': 'NOK', 'ISSUER_INDUSTRY': 'BANK', 'PROFIT': 60},
{'CUR': 'NOK', 'ISSUER_INDUSTRY': 'BANK', 'PROFIT': 80},
{'CUR': 'SEK', 'ISSUER_INDUSTRY': 'BANK', 'PROFIT': 30},
{'CUR': 'SEK', 'ISSUER_INDUSTRY': 'TECH', 'PROFIT': 30},
]
df = pandas.DataFrame(data=data, columns=columns)
df['above_50_quantile_profit'] = df.PROFIT >= df.groupby(['CUR','ISSUER_INDUSTRY']).PROFIT.transform('quantile')
df['above_90_quantile_profit'] = df.PROFIT >= df.groupby(['CUR','ISSUER_INDUSTRY']).PROFIT.transform(lambda x: x.quantile(0.9))
DF现在看起来像
NOK BANK 10 False False
NOK BANK 60 True False
NOK BANK 80 True True
SEK BANK 30 True True
SEK TECH 30 True True
但是实际上,数据从来都不是那么干净。所以我有些行缺少行业数据:
df.loc[df.CUR=='SEK','ISSUER_INDUSTRY'] = numpy.nan
现在我的第一个计算工作正常:
df['above_50_quantile_profit'] = df.PROFIT >= df.groupby(['CUR','ISSUER_INDUSTRY']).PROFIT.transform('quantile')
但是我的第二个:
df['above_90_quantile_profit'] = df.PROFIT >= df.groupby(['CUR','ISSUER_INDUSTRY']).PROFIT.transform(lambda x: x.quantile(0.9))
现在提出:
ValueError: Length mismatch: Expected axis has 3 elements, new values have 5 elements
我知道在NaN上进行分组是一个众所周知的问题(see here),我不明白的是为什么第一个版本.transform('quantile')
遇到相同的问题,因为它也是groupby调用。
有人可以帮助我了解其中的区别吗?