Python 按指定列合并多个数据帧中的列

Python 按指定列合并多个数据帧中的列,python,pandas,Python,Pandas,我正在研究时间序列,在csv文件中有10种不同的股票价格。我试图做的是简单地将它们的收盘价转储到一个数据框中,并用股票名称命名列 我是手工做的,但应该有更好的方法。我还有其他的专栏。以下是我到目前为止所做的。我需要日期匹配。如果其中一个错过了另一个的日期,那么它应该有NaN值,这样我就可以轻松地删除它们 以下是我到目前为止所做的: sym1 = "AAPL" sym2 = "AMZN" s1 = "./stocks/{}.csv".format(sym1) s2 = "./stocks/{}.c

我正在研究时间序列,在csv文件中有10种不同的股票价格。我试图做的是简单地将它们的收盘价转储到一个数据框中,并用股票名称命名列

我是手工做的,但应该有更好的方法。我还有其他的专栏。以下是我到目前为止所做的。我需要日期匹配。如果其中一个错过了另一个的日期,那么它应该有NaN值,这样我就可以轻松地删除它们

以下是我到目前为止所做的:

sym1 = "AAPL"
sym2 = "AMZN"
s1 = "./stocks/{}.csv".format(sym1)
s2 = "./stocks/{}.csv".format(sym2)
df = pd.read_csv(s1)
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
ff = pd.read_csv(s2)
ff = ff.reindex(df.index, fill_value=np.nan)
ff[sym1] = df['Close']
ff[sym2] = ff['Close']
print(ff[[sym1, sym2]].tail())

只要两个数据集都存储为具有公共索引(相同数据类型)的数据帧,您就可以这样使用:

最终数据帧中缺少的值将取决于您的数据集以及由
how='left'
部分指定的数据集联接方式。下面是一个构建在4个随机序列上的示例,这些随机序列被两个接一个(简单合并),然后连接到一个包含一些缺失值的数据帧中

使用
left\u index=True,right\u index=True
将指定它们在日期索引上合并。我更愿意这样做,因为根据您的示例,您似乎希望使用日期索引。正如您在问题标题中所说,如果您希望通过任意列合并数据,您可以使用上的
指定它们。但这是不必要的,因为很明显,您正在合并日期数据,存储它们的自然方式是在数据帧中作为索引

片段:

# Imports
import pandas as pd
import numpy as np

# sample data
np.random.seed(123)
AAPL = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
AMZN = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
MSFT = pd.Series(np.random.randn(100),index=pd.date_range('3/1/2000', periods=100)).cumsum()
RNDM = pd.Series(np.random.randn(100),index=pd.date_range('3/1/2000', periods=100)).cumsum()

# two dataframes with a common index
df = pd.concat([AAPL, AMZN], axis = 1)
df.columns = ['AAPL', 'AMZN']
ff = pd.concat([MSFT, RNDM], axis = 1)
ff.columns = ['MSFT', 'RNDM']

# merged dataframe from two dataframes
# that do not perfectly share a common index
dfm = pd.merge(df, ff, how='left', left_index=True, right_index=True)
dfm.head()
               AAPL      AMZN  MSFT  RNDM
2000-01-01 -1.085631  0.642055   NaN   NaN
2000-01-02 -0.088285 -1.335833   NaN   NaN
2000-01-03  0.194693 -0.623569   NaN   NaN
2000-01-04 -1.311601  1.974735   NaN   NaN
2000-01-05 -1.890202  1.950109   NaN   NaN
输出:

# Imports
import pandas as pd
import numpy as np

# sample data
np.random.seed(123)
AAPL = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
AMZN = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
MSFT = pd.Series(np.random.randn(100),index=pd.date_range('3/1/2000', periods=100)).cumsum()
RNDM = pd.Series(np.random.randn(100),index=pd.date_range('3/1/2000', periods=100)).cumsum()

# two dataframes with a common index
df = pd.concat([AAPL, AMZN], axis = 1)
df.columns = ['AAPL', 'AMZN']
ff = pd.concat([MSFT, RNDM], axis = 1)
ff.columns = ['MSFT', 'RNDM']

# merged dataframe from two dataframes
# that do not perfectly share a common index
dfm = pd.merge(df, ff, how='left', left_index=True, right_index=True)
dfm.head()
               AAPL      AMZN  MSFT  RNDM
2000-01-01 -1.085631  0.642055   NaN   NaN
2000-01-02 -0.088285 -1.335833   NaN   NaN
2000-01-03  0.194693 -0.623569   NaN   NaN
2000-01-04 -1.311601  1.974735   NaN   NaN
2000-01-05 -1.890202  1.950109   NaN   NaN
绘图:使用
dfm.Plot()

如您所见,MSFT和RNDM在3月份之前没有任何观测结果。那么,如何处理这些缺失的值呢?这完全取决于数据集的结构以及数据丢失的原因。看一看,了解一些关于如何处理数据帧中缺失数据的建议和简要介绍