2

从对 Pandas DataframePandas 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 很重要。

4

1 回答 1

4

您需要将日期转换为datetime64[ns]dtype(管理日期时间的工作方式)。对象列效率不高,也不能很好地处理 datelikes。允许使用(not-a-time)datetime64[ns]缺失值,请参见此处:http: //pandas.pydata.org/pandas-docs/dev/missing_data.html#datetimesNaT

In [6]: df['Expiry'] = pd.to_datetime(df['Expiry'])

# alternative way of reading in the data (in 0.11.1, as ``NaT`` will be set
# for missing values in a datelike column)
In [4]: df = pd.read_csv('example',parse_dates=['Date','Expiry'])

In [9]: df.dtypes
Out[9]: 
Date        datetime64[ns]
Stock               object
Position             int64
Expiry      datetime64[ns]
same                object
dtype: object

In [7]: df.groupby(['Stock', 'Expiry', 'same'] ,as_index=False)['Position'].sum()
Out[7]: 
  Stock              Expiry same  Position
0     A 2013-06-01 00:00:00   AA       300
1     B                 NaT   BB       300
2     C 2013-06-01 00:00:00   CC       900

In [8]: df.groupby(['Stock', 'Expiry', 'same'] ,as_index=False)['Position'].sum().dtypes
Out[8]: 
Stock               object
Expiry      datetime64[ns]
same                object
Position             int64
dtype: object
于 2013-06-19T11:46:36.613 回答