Python 获取行索引并将其写入数据帧
我有两个具有以下结构的数据帧 DF1 DF2 AA、BB、CC列存储有关每个站点的一些测量信息,可以包含数值,也可以为空。AA、BB、CC中的记录取决于日期和地点。因此,基本上我的步骤是:Python 获取行索引并将其写入数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个具有以下结构的数据帧 DF1 DF2 AA、BB、CC列存储有关每个站点的一些测量信息,可以包含数值,也可以为空。AA、BB、CC中的记录取决于日期和地点。因此,基本上我的步骤是: 1.获取DF1中在AA中有记录的行(然后是BB,然后是CC) 2.将时间间隔和站点名称用作在DF2中查找行的键 3.将来自DF1的行的索引放入DF3中相应的AA/BB/CC列中,其中包含与提供的时间间隔和站点名称匹配的时间、错误和站点记录 预计将实现最终DF3 为了便于使用,我将DF1中的时间列拆分为两列—开
1.获取DF1中在AA中有记录的行(然后是BB,然后是CC)
2.将时间间隔和站点名称用作在DF2中查找行的键
3.将来自DF1的行的索引放入DF3中相应的AA/BB/CC列中,其中包含与提供的时间间隔和站点名称匹配的时间、错误和站点记录 预计将实现最终DF3 为了便于使用,我将DF1中的时间列拆分为两列—开始和结束
df1['Start']=df1['Time'].str.split('-').str[0]
df1['End']=df1['Time'].str.split('-').str[1]
df1['Start']=pd.to_日期时间(df1['Start'])
df1['End']=pd.to_datetime(df1['End'])
cols=['AA','BB','CC']
对于df1[cols]中的列:
df1=df1[(df1[列]!='NS')和(df1[列]!='0')]
对于df1['Site'].unique()中的名称:
如果df2['Site'].str.contains(name)&df2['Time'].between(df1['Start'].values[0],df2['End'].values[0]):
values=df1.index.values.tolist()
df3[列]=[值]
第1步和第2步没问题,但第3步我无能为力。问题是我无法获得如何获取索引来构建具有我想要的结构的df3,因为每个AA、BB、CC列都可能有重复的多个索引
有可能达到预期的结果吗?如果是,需要一些线索我需要做什么
提前感谢使用:
df1['Start'] = df1['Time'].str.split(' - ').str[0]
df1['End'] = df1['Time'].str.split(' - ').str[1]
df1['Start'] = pd.to_datetime(df1['Start'])
df1['End'] = pd.to_datetime(df1['End'])
df2['Time'] = pd.to_datetime(df2['Time'])
#reset_index for avoid lost indices in both, merge together
df = df2.reset_index().merge(df1.reset_index(), on='Site', how='left', suffixes=('','_'))
#filter by condition
df = df[df['Time'].between(df['Start'],df['End'])]
cols = ['AA','BB','CC']
#filter values not matching - not sure if 0 number or 0 string, so added both
m = ~df[cols].isin(['NS', 0, '0'])
#get values from index to cols
df[cols] = m.astype(int).mul(df.pop('index_'), axis=0)
#join together with filter out `0` values
f = lambda x: ','.join(x[x!=0].astype(str))
c = df2.columns.tolist()
#aggregate join
df = df.groupby(['index'] + c)[cols].agg(f).reset_index(level=c)
print (df)
Time Error Site AA BB CC
index
10 2019-04-20 09:25:15 401 AR25 58 58
11 2019-04-20 11:00:10 401 AR25 58 58
15 2019-04-21 23:25:16 404 DP88 60 59,60 59,60
您需要那些行,其中
df1['Time']==df2['Time']和df1['Site']==df2['Site']]
?您能解释一下添加列的逻辑吗?因为例如在final inBB
中没有值,为什么?@jezrael编辑了这篇文章。并非每个站点都可以在AA-CC列中有记录。例如,site1可以有AA和CC数据,site2可以有BB数据,Site3可以有这三种数据中的记录columns@ShanAli有点df1['Time']有一个时间间隔记录,而df2['Time']-精确时间。因此,df2['Time']必须落在df1['Time']的时间间隔内。这就是为什么实际上我将df1['Time']分为开始和结束。
.... | Time | Error | Site |
10 | 20-04-2019 09:25:15 | 401 | AR25 |
11 | 20-04-2019 11:00:10 | 401 | AR25 |
15 | 21-04-2019 23:25:16 | 404 | DP88 |
.... | Time | Error |Site | AA | BB | CC |
1 | 20-04-2019 09:25:15 | 401 |AR25 | 58 | | 58 |
2 | 20-04-2019 11:00:10 | 401 |AR25 | 58 | 58 | |
2 | 21-04-2019 23:25:16 | 404 |DP88 | 59,60 | 59,60 | 59,60 |
df1['Start'] = df1['Time'].str.split(' - ').str[0]
df1['End'] = df1['Time'].str.split(' - ').str[1]
df1['Start'] = pd.to_datetime(df1['Start'])
df1['End'] = pd.to_datetime(df1['End'])
df2['Time'] = pd.to_datetime(df2['Time'])
#reset_index for avoid lost indices in both, merge together
df = df2.reset_index().merge(df1.reset_index(), on='Site', how='left', suffixes=('','_'))
#filter by condition
df = df[df['Time'].between(df['Start'],df['End'])]
cols = ['AA','BB','CC']
#filter values not matching - not sure if 0 number or 0 string, so added both
m = ~df[cols].isin(['NS', 0, '0'])
#get values from index to cols
df[cols] = m.astype(int).mul(df.pop('index_'), axis=0)
#join together with filter out `0` values
f = lambda x: ','.join(x[x!=0].astype(str))
c = df2.columns.tolist()
#aggregate join
df = df.groupby(['index'] + c)[cols].agg(f).reset_index(level=c)
print (df)
Time Error Site AA BB CC
index
10 2019-04-20 09:25:15 401 AR25 58 58
11 2019-04-20 11:00:10 401 AR25 58 58
15 2019-04-21 23:25:16 404 DP88 60 59,60 59,60