熊猫比较
问题描述:
我试图创建基于断列之间的比较可能的数量相差熊猫列,我试图想这样做的最快,最彻底的方法:熊猫比较
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
哇。如此优雅,谢谢!这不会处理df ['date']被计数为大于任何NaT值的问题。我用一个非常高的日期替代NaT的替代方案? – Luke 2014-12-04 22:57:06
啊,是的,我会假设与NaT的比较应该总是False。这看起来像一个错误。您用更高的日期替换它的方式对我来说似乎还可以。 – joris 2014-12-04 23:03:50
提交了一个关于奇怪的NaT行为的问题:https://github.com/pydata/pandas/issues/9005 – joris 2014-12-04 23:19:18