【问题标题】:How to input a specific value (lets say 1) in to particular columns in a dataframe wherein the column names are provided as a list?如何将特定值(比如说 1)输入到数据框中的特定列中,其中列名作为列表提供?
【发布时间】:2019-04-09 01:14:38
【问题描述】:

有两个时间序列数据框,

我。 "stock_rec" --> 有两列 --> 1) 'Date' - 日期时间索引 2) 'Portfolio' - 包含投资组合中每个日期的股票列表

二。 "stock_matrix" --> 有 6 列 --> 1) 'Date' - 日期时间索引 2 到 6) Stock1、Stock2、Stock3、Stock4 和 Stock5。数据框目前为空

要执行的操作:对于每个日期,根据投资组合中的股票列表(Stock1、Stock2、Stock3、Stock4、Stock5)(在“stock_rec”中可用),特定单元格在“stock_matrix”中需要制作1。

预期输出:假设对于“Jan 2018”(日期索引),“stock_rec”表示 ['Stock1','Stock4'] 在投资组合中。然后,日期“2018 年 1 月”的数据框“stock_matrix”中的列 ['Stock1'] 和 ['Stock4'] 中的值需要设为 1

输入:

stock_rec	
Date	Portfolio
Jan-10	['Stock 1','Stock 5']
Feb-10	['Stock 2','Stock 5']
Mar-10	['Stock 3','Stock 4','Stock 5]
Apr-10	['Stock 1']
May-10	[]

stock_matrix
Date	Stock 1	Stock 2	Stock 3	Stock 4	Stock 5
Jan-10	NaN	NaN	NaN	NaN	NaN
Feb-10	NaN	NaN	NaN	NaN	NaN
Mar-10	NaN	NaN	NaN	NaN	NaN
Apr-10	NaN	NaN	NaN	NaN	NaN
May-10	NaN	NaN	NaN	NaN	NaN

输出:

stock_matrix
Date	Stock 1	Stock 2	Stock 3	Stock 4	Stock 5
Jan-10	1	NaN	NaN	NaN	1
Feb-10	NaN	1	NaN	NaN	1
Mar-10	NaN	NaN	1	1	1
Apr-10	1	NaN	NaN	NaN	NaN
May-10	NaN	NaN	NaN	NaN	NaN

【问题讨论】:

  • 请提供示例数据和该数据的示例输出。
  • 可能是 col.str.contains 和 np.where,但作为 @MattW。声明,我们需要查看数据样本才能为您的请求创建minimal reproducible example
  • @Matt W 和@G. Anderson - 已添加示例数据并预期输出
  • @Matt W - 谢谢。已对您的帖子发表了一些评论。

标签: python jupyter-notebook


【解决方案1】:

您首先需要取消列出或堆叠一系列列表

截取您的数据框并定义我们想要的所有股票:

stocks = ['Stock 1', 'Stock 2', 'Stock 3', 'Stock 4', 'Stock 5']

df = pd.DataFrame({'date':['Jan-10', 'Feb-10'], 'Portfolio':[['Stock 1', 'Stock 5', 'Stock 4'], ['Stock 2', 'Stock 5']]})

我要做的第一件事是为缺失的列创建一个假的 "None" 字段:

df['Portfolio'] = [['None'] if x == [] else x for x in df['Portfolio']]

现在我们将索引设置为日期列,然后我们只获取我们想要的系列。然后,我们将每个列表应用为自己的系列,然后将它们全部堆叠在一起。然后我们重置索引,以便我们将日期返回到数据框中。我们删除创建的 level_1,并将 0 列重命名为 Portfolio。最后,我们创建一个新列,其中只有 1 以供以后使用。

df = df.set_index('date').Portfolio.apply(pd.Series) \
        .stack() \
        .reset_index(drop=False) \
        .drop(['level_1'], axis=1) \
        .rename(columns={0:'Portfolio'}) \
        .assign(v=1)

     date Portfolio  v
0  Jan-10   Stock 1  1
1  Jan-10   Stock 5  1
2  Jan-10   Stock 4  1
3  Feb-10   Stock 2  1
4  Feb-10   Stock 5  1

现在我们可以旋转它了。

pd.pivot_table(df,
               columns='Portfolio',
               index='date',
               values='v') \
  .drop(['None'], axis=1)

现在我们添加股票列表中缺少的任何内容:

missing_cols = np.array(stocks)[~pd.Series(stocks).isin(piv.columns)].tolist()   
for col in missing_cols:
    piv[col] = np.nan

Portfolio  Stock 1  Stock 2  Stock 4  Stock 5  Stock 3
date                                                  
Feb-10         NaN      1.0      NaN      1.0      NaN
Jan-10         1.0      NaN      1.0      1.0      NaN
Mar-10         NaN      NaN      NaN      NaN      NaN

如果您希望NaNs 成为0s,您可以将fill_value=0 参数传递给pd.pivot_table()

【讨论】:

  • 谢谢马特,这是一个非常简洁的方法,唯一的问题是这不能确保所有列(“Stock 1”到“Stock 5”)都在输出中,即使它将是“Nan”,输出中需要有“Stock 3”列。有什么办法可以在代码中解决这个问题。
  • @AravindGanesan 我刚刚更新了代码来解决这个问题。我只是编辑了开始的代码以制作一个名为“None”的假“Stock”,然后最后将其丢弃。另外 - 我刚刚意识到您正在调用缺少的 Stock 3。我没有在我的开始代码中包含它。因此,如果您有所有列的起点,那么我会在它们缺失的地方添加 Nan 列。
  • @AravindGanesan 修复了缺少列的问题,但如果它在您的数据集中,它应该显示一个日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 2021-11-04
  • 2018-08-24
  • 2020-04-14
  • 1970-01-01
  • 2015-07-30
相关资源
最近更新 更多