从对 Pandas Dataframe 和Pandas Dataframe 对象类型行求和的跟进,在不同的数据类型上填充异常
我正在汇总使用的列之一
df.groupby(['stock', 'same1', 'same2'], as_index=False)['positions'].sum()
如果缺少数据,这种方法不是很宽容。如果在 same1、same2 等中有任何缺失的数据,它会填充完全不相关的值。解决方法是在列上执行一个 fillna 循环,用 '' 替换缺失的字符串,用零替换缺失的数字可以解决问题。
但是,我确实有一列缺少日期。列类型是“对象”,nan 类型为 float,并且在现有数据字段中缺少单元格和日期时间对象。重要的是我知道数据丢失了,即丢失的指标必须在 groupby 转换中幸存下来。
概述问题的数据集:
我用作输入的 csv 文件是:
Date,Stock,Position,Expiry,same
2012/12/01,A,100,2013/06/01,AA
2012/12/01,A,200,2013/06/01,AA
2012/12/01,B,300,,BB
2012/6/01,C,400,2013/06/01,CC
2012/6/01,C,500,2013/06/01,CC
然后我读入文件:
df = pd.read_csv('example', parse_dates=[0])
def convert_date(d):
'''Converts YYYY/mm/dd to datetime object'''
if type(d) != str or len(d) != 10: return np.nan
dd = d[8:]
mm = d[5:7]
YYYY = d[:4]
return datetime.datetime(int(YYYY), int(mm), int(dd))
df['Expiry'] = df.Expiry.map(convert_date)
df
df 看起来像:
Date Stock Position Expiry same
0 2012-12-01 00:00:00 A 100 2013-06-01 00:00:00 AA
1 2012-12-01 00:00:00 A 200 2013-06-01 00:00:00 AA
2 2012-12-01 00:00:00 B 300 NaN BB
3 2012-06-01 00:00:00 C 400 2013-06-01 00:00:00 CC
4 2012-06-01 00:00:00 C 500 2013-06-01 00:00:00 CC
可以很容易地更改 convert_date 函数以弹出任何其他内容以在 Expiry 列中丢失数据。
然后使用:
df.groupby(['Stock', 'Expiry', 'same'] ,as_index=False)['Position'].sum()
聚合位置列。Get a TypeError: can't compare datetime.datetime to str与我插入缺失日期数据的任何非日期。对于以后的功能了解是否缺少 Expiry 很重要。