用分组列中的NaN值进行熊猫变换

时间:2019-10-30 10:12:30

标签: python pandas dataframe

我正在尝试进行一些计算。效果很好:

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调用。

有人可以帮助我了解其中的区别吗?

0 个答案:

没有答案