熊猫比较

问题描述:

我试图创建基于断列之间的比较可能的数量相差熊猫列,我试图想这样做的最快,最彻底的方法:熊猫比较

id  date  birth_date_1 birth_date_2 
1 1/1/2000 1/3/2000  1/5/2000 
1 1/7/2000 1/3/2000  1/5/2000 
2 1/2/2000 1/10/2000  1/1/2000 
2 1/5/2000 1/10/2000  1/1/2000 
3 1/4/2000  NaT   NaT 

我的目标是创建一个新列计数当前日期前出生日期的数字:

id  date  birth_date_1 birth_date_2 num_born_before_date 
1 1/1/2000 1/3/2000  1/5/2000    0 
1 1/7/2000 1/3/2000  1/5/2000    2 
2 1/2/2000 1/10/2000  1/1/2000   1 
2 1/5/2000 1/10/2000  1/1/2000   1 
3 1/4/2000  NaT   NaT    0 

需要说明的是,birth_date列数将在每次运行而有所不同。我不想迭代条目,因为这将是非常缓慢的...

编辑:用np.where找到了一点肮脏的黑客。不知道是否有更好的方法来做到这一点,特别是在处理NaT方面。

NAT2 = pd.to_datetime('01-01-2100') # need this to deal with NaTs 
df = df.fillna(NAT2) 

df['num_born'] = 0 
created_cols = [c for c in df.columns if 'birth_date' in c] 

for col in created_cols: 
    df['num_born'] = np.where((df['date'] >= df[col]), 
           df['num_born'] + 1, df['num_born']) 
df = df.replace(to_replace=NAT2, value=pd.NaT) 

因此,假如你的数据框已解析的datetime列(你可以使用to_datetime为,或如在read_csv指定parse_dates):

In [64]: df 
Out[64]: 
    id  date birth_date_1 birth_date_2 
0 1 2000-01-01 2000-01-03 2000-01-05 
1 1 2000-01-07 2000-01-03 2000-01-05 
2 2 2000-01-02 2000-01-10 2000-01-01 
3 2 2000-01-05 2000-01-10 2000-01-01 

现在,您可以检查其中的“birth_date值“列是比在该值低‘日期’列中,然后使用sum计数:

In [65]: df[['birth_date_1', 'birth_date_2']].lt(df['date'], axis=0) 
Out[65]: 
    birth_date_1 birth_date_2 
0  False  False 
1   True   True 
2  False   True 
3  False   True 

In [66]: df[['birth_date_1', 'birth_date_2']].lt(df['date'], axis=0).sum(axis=1) 

Out[66]: 
0 0 
1 2 
2 1 
3 1 
dtype: int64 

要DEA ●具有不同数量的 'birth_date' 栏目,你可以用filter自动做到这一点,是这样的:

In [67]: df.filter(like="birth_date") 
Out[67]: 
    birth_date_1 birth_date_2 
0 2000-01-03 2000-01-05 
1 2000-01-03 2000-01-05 
2 2000-01-10 2000-01-01 
3 2000-01-10 2000-01-01 

总之,这将使:

In [66]: df.filter(like="birth_date").lt(df['date'], axis=0).sum(axis=1) 

Out[66]: 
0 0 
1 2 
2 1 
3 1 
dtype: int64 
+0

哇。如此优雅,谢谢!这不会处理df ['date']被计数为大于任何NaT值的问题。我用一个非常高的日期替代NaT的替代方案? – Luke 2014-12-04 22:57:06

+0

啊,是的,我会假设与NaT的比较应该总是False。这看起来像一个错误。您用更高的日期替换它的方式对我来说似乎还可以。 – joris 2014-12-04 23:03:50

+0

提交了一个关于奇怪的NaT行为的问题:https://github.com/pydata/pandas/issues/9005 – joris 2014-12-04 23:19:18