过滤掉大型pandas数据帧中的数据

时间:2016-05-21 16:25:29

标签: python pandas

我试图在我庞大的数据框架中过滤掉几年 这是我的数据非常简短的版本:

Year  Value  Symbol
2001  0.1      ABC
2002  0.1      ABC
2003  0.2      ABC
2002  0.4      ZZZ
2003  0.8      ZZZ
2000  0.9      ASD
2001  0.1      ASD
2002  0.3      ASD
2003  0.2      ASD

正如您所见,我的数据集中不同的符号有不同的起始年份。例如,符号ASD在2000年具有其第一个值,而在2002年仅具有符号ZZZ。在此特定情况下,我希望仅保留数据,其中所有符号都具有其值。结果应如下所示:

Year  Value  Symbol  
2002  0.1      ABC
2003  0.2      ABC
2002  0.4      ZZZ
2003  0.8      ZZZ
2002  0.3      ASD
2003  0.2      ASD

我的大数据框的问题是我有很多日期,我不知道每个符号的开始日期(我有很多符号)。所以我应该首先找到每个符号的起始日期(或具有后一个开始日期的符号),然后删除所有不必要的数据。有没有办法在pandas / python中有效地执行此操作?

2 个答案:

答案 0 :(得分:4)

您可以使用pivot,然后使用dropnaunstack

df = df.pivot(index='Year', columns='Symbol', values='Value')
        .dropna()
        .unstack()
        .reset_index(name='Value')

print (df)
  Symbol  Year  Value
0    ABC  2002    0.1
1    ABC  2003    0.2
2    ASD  2002    0.3
3    ASD  2003    0.2
4    ZZZ  2002    0.4
5    ZZZ  2003    0.8

答案 1 :(得分:2)

您必须分享当前的代码才能获得更多信息丰富的效果建议;这是一个简单的方法: 找出有多少个唯一符号,并且只保留具有许多独特符号的年份。

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO(
'''Year  Value  Symbol
2001  0.1      ABC
2002  0.1      ABC
2003  0.2      ABC
2002  0.4      ZZZ
2003  0.8      ZZZ
2000  0.9      ASD
2001  0.1      ASD
2002  0.3      ASD
2003  0.2      ASD'''), sep=r' +')

unique_symbol_count = df.Symbol.value_counts().keys().shape[0]
good_years_df = df.groupby('Year').filter(lambda gp: gp.Symbol.value_counts().shape[0] == unique_symbol_count)

#    Year  Value Symbol
# 1  2002    0.1    ABC
# 2  2003    0.2    ABC
# 3  2002    0.4    ZZZ
# 4  2003    0.8    ZZZ
# 7  2002    0.3    ASD
# 8  2003    0.2    ASD