我一直在尝试学习如何使用Pandas,但对于API中的何处查找可以根据日期范围内的符号有条件地聚合数据的方法,我感到非常困惑。我有一个这样的数据框:
Date Change
2010-08-25 0.08
2010-08-26 -0.22
2010-08-27 0.04
2010-08-30 -0.08
2010-08-31 -0.11
... ...
2020-08-18 0.96
2020-08-19 -1.79
2020-08-20 5.04
2020-08-21 -0.84
2020-08-24 -1.10
日期列当然是一个索引。我要做的基本上是按年份划分此数据。按年份划分后,我想按change列的符号对连续的行进行分组,以便将连续的负数和连续的正数分组在一起。完成后,我想获得所有年份的日期范围与符号匹配的重叠部分。例如,如果从2010-08-25到2010-08-27以及2011-08-26到2011-08-29的变化是正的,则常见的重叠范围是08-26到08-27,这显然是所有年份的结果不仅是2。那时候,一旦我有了通用的日期范围及其值,我就希望对该范围内的所有数字取平均值,以使最后我得到的日期范围内的变化始终为正或负,并且平均值改变每个范围。我该如何实现?
答案 0 :(得分:0)
这是IIUC的一种方法(注释嵌入下面的代码中):
from io import StringIO
import pandas as pd
data = '''Date Change
2010-08-25 0.08
2010-08-26 -0.22
2010-08-27 0.04
2010-08-30 -0.08
2010-08-31 -0.11
2020-08-18 0.96
2020-08-19 -1.79
2020-08-20 5.04
2020-08-21 -0.84
2020-08-24 -1.10
'''
# create data frame
df = pd.read_csv(StringIO(data), sep='\s+',
engine='python', parse_dates=['Date'],
index_col='Date')
# make a variable to segment positive vs negative changes
df['is_positive'] = (df['Change'] >= 0).astype(int)
# make a variable for the year
df['year'] = df.index.year
# groupby to calculate mean for each (year, is_positive)
# transform() returns same number of rows as original data
# (for illustration purposes)
df['mean_change'] = df.groupby(['year', 'is_positive'])['Change'].transform('mean')
# sort and print
df = df.sort_values(['year', 'is_positive', 'Change'])
print(df)
Change is_positive year mean_change
Date
2010-08-26 -0.22 0 2010 -0.136667
2010-08-31 -0.11 0 2010 -0.136667
2010-08-30 -0.08 0 2010 -0.136667
2010-08-27 0.04 1 2010 0.060000
2010-08-25 0.08 1 2010 0.060000
2020-08-19 -1.79 0 2020 -1.243333
2020-08-24 -1.10 0 2020 -1.243333
2020-08-21 -0.84 0 2020 -1.243333
2020-08-18 0.96 1 2020 3.000000
2020-08-20 5.04 1 2020 3.000000