繁体   English   中英

Pandas pivot_table 取最近的值,如果最近的值代表某个百分比的值存在

[英]Pandas pivot_table taking most recent value if the most recent value represents a certain percentage the values present

我试图在海量数据集中查找某些 ID 和代码的值,并且我试图通过为每个唯一对获取最近使用的值来获取这些值。 我目前只是使用下面的代码获取最近使用的代码

data.head()
    ID      Code    value
15  13513   X2784   30.0
16  12665   X2744   65.0
17  16543   X2744   65.0
19  15761   X2100   29.0
21  14265   X2750   48.0

df = data.pivot_table(index='ID', columns='Code', values='value', aggfunc = 'first')

df.head()
ID      X2784   X2744   X2100   X2750
13271   30.0    65.0    29.0    35.0
16343   30.0    65.0    29.0    35.0
19342   30.0    65.0    29.0    35.0
15437   30.0    65.0    29.0    35.0
14359   30.0    65.0    29.0    48.0

问题是由于数据异常,其中一些值是错误的。 想法是查看最近的值,确定它是否代表该对的所有值的某个百分比,然后分配它。 这个问题的一个例子是这样的:

data[(data['ID'] == '14359') & (data['Code'] == 'X2750')]['value'].value_counts()
35.0     2530
48.0        2

29.0 的值是最近发生的,但它发生的次数非常少,应该被视为异常。 有什么方法可以将 pivot_table aggfunc “first”与某种出现的阈值结合起来?

如果您确定多数始终是您希望的值,您可以使用中值聚合来获得“中间”或“50% 分位数”值。 这将切断所有异常。

试试这个 function:

df = data.pivot_table(index='ID', columns='Code', values='value', aggfunc = 'first', aggfunc=np.median)

我能够使用 aggfunc 的 lambda function 弄清楚

aggfunc = lambda x: x.iloc[0] if x.value_counts()[x.iloc[0]]/x.value_counts().sum() > .25 else x.mode(dropna = False).iat[0]

感谢大家的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM