Python 基于时间戳中两个Xolumn中的元素分隔行
基于两个日期范围(98-00和01-03),我希望得到两个单独的数据帧(每个日期范围一个),其中仅存在两个范围值中都存在的节点。 例如,第一行中的node2:5仅出现在98-00范围内,而不出现在01-03范围内,因此我们排除所有带5的行(可以在node1或node2列中)。同样,第二行node1:2中的node2:2仅出现在01-02日期范围内,因此排除两个数据帧中带值2的所有行。) 预期产出: 在一个数据帧中:节点1节点2日期Python 基于时间戳中两个Xolumn中的元素分隔行,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,基于两个日期范围(98-00和01-03),我希望得到两个单独的数据帧(每个日期范围一个),其中仅存在两个范围值中都存在的节点。 例如,第一行中的node2:5仅出现在98-00范围内,而不出现在01-03范围内,因此我们排除所有带5的行(可以在node1或node2列中)。同样,第二行node1:2中的node2:2仅出现在01-02日期范围内,因此排除两个数据帧中带值2的所有行。) 预期产出: 在一个数据帧中:节点1节点2日期 data = {'date': ['1998', '2002',
data = {'date': ['1998', '2002','1999','2001','1998','2002'],
'node1': [1,1,1,1,3,3],
'node2': [5,3,3,2,4,4],
'weight': [1,1,1,1,1,1], }
df = pd.DataFrame(data, columns = ['date', 'node1','node2','weight'])
1 3 1999
3 4 1998
第二个数据帧:节点1节点2日期
data = {'date': ['1998', '2002','1999','2001','1998','2002'],
'node1': [1,1,1,1,3,3],
'node2': [5,3,3,2,4,4],
'weight': [1,1,1,1,1,1], }
df = pd.DataFrame(data, columns = ['date', 'node1','node2','weight'])
1 3 1999
3 4 1998
使用
pd.cut
1 3 2001
3 4 2002
您可以将它们存储在列表中
df = df[df.duplicated(['node1','node2'],keep = False)]
df['range']=pd.cut(df.date.astype(int),[1997,2000,2002])
for x,y in df.dropna().groupby('range'):
print(x)
print(y)
(1997, 2000]
date node1 node2 weight range
2 1999 1 3 1 (1997, 2000]
4 1998 3 4 1 (1997, 2000]
(2000, 2002]
date node1 node2 weight range
1 2002 1 3 1 (2000, 2002]
5 2002 3 4 1 (2000, 2002]
可以使用.between()为每个数据帧筛选所需的行
l=[]
for _,y in df.dropna().groupby('range'):
l.append(y)
df1
df2
如果日期列为1998-02-12格式,请将其转换为datetime并使用.dt访问器获取年份
date node1 node2 weight
1 2002 1 3 1
5 2002 3 4 1
基本上,这是从两列node1和node2搜索元素,如果它们都在范围内(98-00和01-03)。如果元素不在任何范围内,则不包括包含该元素的行。我的实际日期格式为1998-02-12。这会在代码中产生问题吗?因为我得到的答案略有不同。谢谢
import datetime as dt
df['date'] = pd.to_datetime(df['date'])
df1 = df[df['date'].dt.year.between(1998, 2000)]
df2 = df[df['date'].dt.year.between(2001, 2003)]