如何将一列数据帧的值与其他数据帧中的正确行相匹配?
How to match the values of a column of dataframe with the correct rows in other dataframes?
我有许多包含日期(每天)和温度数据的 csv 文件。然而,这些文件的日期不同(有时重叠,缺少日期,......)。我想要做的是创建一个源文件,第一列作为日期(包括所有日期),并添加来自不同 csv 文件的温度数据列,对应于日期。
为了简单起见,我正在考虑我只有一个文件 (df1)。
所以我将日期时间 (df2) 定义为我的源文件,并尝试使用 pd.concate() 将 df1 添加到其中。这有效,但它删除了 df1 中不可用的日期,而我想保留所有行。
import pandas as pd
data = {'Datestart':['1/1/2010', '1/2/2010', '1/5/2010', '1/10/2010'], 'Temp':[20, 21, 19, 18]}
df1 = pd.DataFrame(data)
df2 = pd.DataFrame()
df2['Date'] = pd.date_range(start='1/1/2010', end='1/20/2010', freq='D')
df3 = pd.concat([df2.set_index('Date'), df1.set_index('Datestart').Temp],axis=1,join='inner')
它创建了这个:
Temp
2010-01-01 20
2010-01-02 21
2010-01-05 19
2010-01-10 18
虽然我需要这个:
1/1/2010 20
1/2/2010 21
1/3/2010 NaN
1/4/2010 NaN
1/5/2010 19
1/6/2010 NaN
1/7/2010 NaN
1/8/2010 NaN
1/9/2010 NaN
1/15/2010 18
1/16/2010 NaN
1/17/2010 NaN
1/20/2010 NaN
1/21/2010 NaN
在您的 pd.concat
调用中,尝试使用 join=outer
而不是 join=inner
。这应该是来自两个数据集的 return 个条目。
尝试先将 Datestart
转换为日期时间,然后再合并。
df1['Datestart'] = pd.to_datetime(df1['Datestart'])
df3 = df1.merge(df2, how = "outer", left_on = 'Datestart', right_on = 'Date')
然后您可以删除 Datestart
列并重新设置日期列的格式。
df3.drop('Datestart', axis = 1, inplace = True)
df3['Date'] = df3['Date'].dt.strftime('%m/%d/%Y')
df3.set_index('Date', inplace = True)
df3.sort_index(inplace = True)
#Prints
Temp
Date
01/01/2010 20.0
01/02/2010 21.0
01/03/2010 NaN
01/04/2010 NaN
01/05/2010 19.0
01/06/2010 NaN
01/07/2010 NaN
01/08/2010 NaN
01/09/2010 NaN
01/10/2010 18.0
01/11/2010 NaN
01/12/2010 NaN
01/13/2010 NaN
01/14/2010 NaN
01/15/2010 NaN
01/16/2010 NaN
01/17/2010 NaN
01/18/2010 NaN
01/19/2010 NaN
01/20/2010 NaN
我有许多包含日期(每天)和温度数据的 csv 文件。然而,这些文件的日期不同(有时重叠,缺少日期,......)。我想要做的是创建一个源文件,第一列作为日期(包括所有日期),并添加来自不同 csv 文件的温度数据列,对应于日期。
为了简单起见,我正在考虑我只有一个文件 (df1)。 所以我将日期时间 (df2) 定义为我的源文件,并尝试使用 pd.concate() 将 df1 添加到其中。这有效,但它删除了 df1 中不可用的日期,而我想保留所有行。
import pandas as pd
data = {'Datestart':['1/1/2010', '1/2/2010', '1/5/2010', '1/10/2010'], 'Temp':[20, 21, 19, 18]}
df1 = pd.DataFrame(data)
df2 = pd.DataFrame()
df2['Date'] = pd.date_range(start='1/1/2010', end='1/20/2010', freq='D')
df3 = pd.concat([df2.set_index('Date'), df1.set_index('Datestart').Temp],axis=1,join='inner')
它创建了这个:
Temp
2010-01-01 20
2010-01-02 21
2010-01-05 19
2010-01-10 18
虽然我需要这个:
1/1/2010 20
1/2/2010 21
1/3/2010 NaN
1/4/2010 NaN
1/5/2010 19
1/6/2010 NaN
1/7/2010 NaN
1/8/2010 NaN
1/9/2010 NaN
1/15/2010 18
1/16/2010 NaN
1/17/2010 NaN
1/20/2010 NaN
1/21/2010 NaN
在您的 pd.concat
调用中,尝试使用 join=outer
而不是 join=inner
。这应该是来自两个数据集的 return 个条目。
尝试先将 Datestart
转换为日期时间,然后再合并。
df1['Datestart'] = pd.to_datetime(df1['Datestart'])
df3 = df1.merge(df2, how = "outer", left_on = 'Datestart', right_on = 'Date')
然后您可以删除 Datestart
列并重新设置日期列的格式。
df3.drop('Datestart', axis = 1, inplace = True)
df3['Date'] = df3['Date'].dt.strftime('%m/%d/%Y')
df3.set_index('Date', inplace = True)
df3.sort_index(inplace = True)
#Prints
Temp
Date
01/01/2010 20.0
01/02/2010 21.0
01/03/2010 NaN
01/04/2010 NaN
01/05/2010 19.0
01/06/2010 NaN
01/07/2010 NaN
01/08/2010 NaN
01/09/2010 NaN
01/10/2010 18.0
01/11/2010 NaN
01/12/2010 NaN
01/13/2010 NaN
01/14/2010 NaN
01/15/2010 NaN
01/16/2010 NaN
01/17/2010 NaN
01/18/2010 NaN
01/19/2010 NaN
01/20/2010 NaN