考虑大熊猫中两个时间戳范围条件的交集

时间:2017-09-23 10:30:04

标签: python python-2.7 pandas dataframe

import pandas as pd

data = {'date': ['1998-03-01', '2001-04-01','1998-06-01','2001-08-01','2001-05-03'], 
    'node1': [1, 1, 2,2,3],
 'node2': [8,316,26,35,44],
 'weight': [1,1,1,1,1], }
df = pd.DataFrame(data, columns = ['date', 'node1','node2','weight'])
print(df)

mask1 = (df['date'] > '1998-01-01 00:00:01') & (df['date'] <= '2000-01-01 
00:00:01')
mask2 = (df['date'] > '2000-01-01 00:00:01') & (df['date'] <= '2003-01-01 
00:00:01')

mask = pd.concat((mask1, mask2), axis=1)
slct = mask.all(axis=1)
print df.ix[slct]

以上是我的尝试。数据集(以上是玩具数据集)有4列,即node1,node2,weight,timestamp。我想创建两组具有条件的行:set1应该有时间戳在98-00年之间的行和设置为2 00-02年的行。

这两个集合都应该是年度范围(98-00和00-02)中的行。

所以在上面的例子中,两个集应该是{1,2}和{1,2} .3应该被排除,因为它只出现在00-02范围内。 但我在答案中得到空框架。 首先,我做了mask1和mask2以获得满足各个范围的行,然后我将它们连接起来以找到两个条件的交集。

2 个答案:

答案 0 :(得分:1)

这里有2个问题。首先,mask1和mask2只给你布尔值。您需要使用这2个布尔值来索引数据帧。

其次,你的pd.concat将iterable作为参数,你提供了对象。

检查出来

function

我仍然不确定你的输出究竟是多少。另外我建议停止使用.ix并开始习惯使用.loc和.iloc

答案 1 :(得分:1)

你可以使用groupby和isin知道日期包含1998-2000和2000-2002,即使用基于node1的groupby这样的掩码

df['date'] = pd.to_datetime(df['date'])
mask = df.groupby('node1').apply(lambda x : (x['date'].dt.year.isin([1998,1999,2000])).any())
mask2 = df.groupby('node1').apply(lambda x : (x['date'].dt.year.isin([2000,2001,2002])).any())

df[df['node1'].isin(mask[mask & mask2].index)] # Get the dataframe 

解释

maskmask2将提供类似

的掩码
mask                  mask2
(node1                  node1
 1     True           1    True
 2     True           2    True
 3    False           3    True
 dtype: bool,        dtype: bool)

稍后我们可以使用&来获取基于真值表的掩码,这是一个只有真值的新掩码,即

mask[mask & mask2] 
node1
1    True
2    True
dtype: bool

根据新的掩码选择df,即

df['node1'].isin(mask[mask & mask2].index)
0     True
1     True
2     True
3     True
4    False
Name: node1, dtype: bool

输出:

df[df['node1'].isin(mask[mask & mask2].index)]
        date  node1  node2  weight
0 1998-03-01      1      8       1
1 2001-04-01      1    316       1
2 1998-06-01      2     26       1
3 2001-08-01      2     35       1