我试图在我庞大的数据框架中过滤掉几年 这是我的数据非常简短的版本:
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中有效地执行此操作?
答案 0 :(得分:4)
您可以使用pivot
,然后使用dropna
和unstack
:
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