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以获得满足各个范围的行,然后我将它们连接起来以找到两个条件的交集。
答案 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
解释:
mask
和mask2
将提供类似
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