按指定列合并来自多个数据框的列

时间:2019-02-26 16:10:55

标签: python pandas

我正在处理时间序列,并且在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())

1 个答案:

答案 0 :(得分:1)

只要您将两个数据集都存储为具有相同索引(具有相同数据类型)的数据框,就可以像这样使用pd.merge()

df2 = pd.merge(df, ff, how='left',left_index = True, right_index = True)

最终数据框中缺少的值将取决于您的数据集以及how='left'部分所指定的连接方式。下面是一个示例,该示例建立在4个随机序列的基础上,这些序列被两个(两个)串联(简单合并),然后加入到具有某些缺失值的单个数据帧中。

使用left_index = True, right_index = True将指定它们已合并到您的日期索引中。我更喜欢这样做,因为在您的示例中您似乎想使用日期索引。就像您在问题标题中所说的那样,您当中的所有人希望通过任意列合并数据,您可以使用on指定它们。但这不是必需的,因为很明显,您正在按日期合并数据,并且自然地将它们存储为数据框中的索引。

代码段:

# 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()

enter image description here

如您所见,MSFT和RNDM在进行月份之前没有任何观察。那么,如何处理所有这些缺失的值?这完全取决于数据集的结构以及数据丢失的原因。看看What to do with missing values when plotting with seaborn?,了解有关如何处理熊猫数据帧中缺失数据的一些建议和简要介绍。