首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将特定值(例如1)输入到dataframe中的特定列中,其中列名作为列表提供?

如何将特定值(例如1)输入到dataframe中的特定列中,其中列名作为列表提供?
EN

Stack Overflow用户
提问于 2019-04-01 19:17:08
回答 1查看 105关注 0票数 0

有两个时间序列数据

I. "stock_rec“->有两列

II. "stock_matrix“->有6列--> 1) ' date‘--日期时间索引2至6) Stock1、Stock2、Stock3、Stock4和Stock5。到目前为止,数据文件是空的。

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

预期产出:假设“2018年1月”(日期指数),"stock_rec“表示'Stock1‘、'Stock4’在投资组合中。然后,需要为日期为“2018年1月”的dataframe“Stock1”和“Stock4”列中的值设置1。

输入:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2019-04-03 16:14:58

您首先需要取消列表,或者堆叠列表系列。

取一段数据片段,定义我们想要的所有股票:

代码语言:javascript
复制
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"字段:

代码语言:javascript
复制
df['Portfolio'] = [['None'] if x == [] else x for x in df['Portfolio']]

现在,我们将索引设置为date列,然后只获取所需的序列。然后,我们将每个列表作为自己的系列应用,然后将它们全部堆叠在另一个列表之上。然后重新设置索引,以便将日期返回到dataframe中。我们删除创建的level_1,并将0列重命名为Portfolio。最后,我们创建了一个只有1s的新列供以后使用。

代码语言:javascript
复制
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

现在我们就可以把它转起来了。

代码语言:javascript
复制
pd.pivot_table(df,
               columns='Portfolio',
               index='date',
               values='v') \
  .drop(['None'], axis=1)

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

代码语言:javascript
复制
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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55462085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档