我正在使用熊猫来分析财务记录。
我有一个来自csv文件的DataFrame
,如下所示:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 800 entries, 2010-10-27 00:00:00 to 2011-07-12 00:00:00
Data columns:
debit 800 non-null values
transaction_type 799 non-null values
transaction_date_raw 800 non-null values
credit 800 non-null values
transaction_description 800 non-null values
account_number 800 non-null values
sort_code 800 non-null values
balance 800 non-null values
dtypes: float64(3), int64(1), object(4)
我根据交易金额选择了一个子集:
c1 = df['credit'].map(lambda x: x > 1000)
milestones = df[c1].sort()
并希望根据里程碑之间的日期创建原始df的切片:
delta = dt.timedelta(days=1)
for i in range(len(milestones.index)-1):
start = milestones.index[i].date()
end = milestones.index[i+1].date() - delta
rng = date_range(start, end)
这将生成一个新系列,其中包含我的里程碑之间的日期。
<class 'pandas.tseries.index.DatetimeIndex'>
[2010-11-29 00:00:00, ..., 2010-12-30 00:00:00]
Length: 32, Freq: D, Timezone: None
我已经使用了几种方法来使用这些新系列(rng)切片我的df但是失败了:
df.ix[start:end] or
df.ix[rng]
这引发:IndexError:无效切片
df.reindex(rng) or df.reindex(index=rng)
引发:例外:重新索引仅对具有唯一值的索引对象有效
x = [v for v in rng if v in df.index]
df[x]
df.ix[x]
df.index[x]
这也会引发无效切片,所以:
df.truncate(start, end)
我是大熊猫的新手,我正在关注奥利利早期的这本书,并且非常享受它。任何指针都会受到赞赏。
答案 0 :(得分:1)
看起来你在非唯一索引处理中遇到了几个已知错误:
https://github.com/pydata/pandas/issues/1201/
https://github.com/pydata/pandas/issues/1587/
错误修复版本很快就会推出,所以请在一周左右的时间内查看pandas网站或PyPI。
由于
答案 1 :(得分:1)
我设法绕过了上面强调的一些问题,这是一个“解决方案”,直到Chang She提到的错误得到解决。
我从以前的原始TimeSeries索引DataFrame开始。我对df进行排序,按日期排序记录(使用TimeSeries索引)。
df = df.sort()
一旦排序,我用数字索引
替换df.indexdf.index = range(len(df))
我随后像以前一样提取我的里程碑,差异现在它们将有一个正整数的索引,并创建该索引的列表:
milestones_list = milestones_df.index.tolist()
使用数字索引从原始df中提取我的里程碑之间的数据,如下所示:
datasets = {}
for milestone in milestones_list:
milestone_index = milestones_list.index(milestone)
print "milestone {0} index {1}".format(milestone, milestone_index)
if milestone_index < len(milestones_list) -1:
x = df[milestones_df.index[milestone_index]:milestones_df.index[milestone_index+1]]
else:
x = df[milestones_df.index[milestone_index]:df.index.max()]
n = str(int(x.index.min())) +'-'+ str(int(x.index.max()))
datasets[n] = x
这为每个里程碑时间间隔创建一个带有DataFrames的dict,命名为它们所代表的索引间隔。
print datasets.keys()
['592-650', '448-527', '382-447', '264-318', '319-381', '118-198', '528-591', '728-798', '54-117', '199-263', '651-727']
虽然这不是理想的解决方案,但我希望它可以帮助有类似问题的人。