【问题标题】:Duplicate dataframe row for each row that matches dict mapping匹配字典映射的每一行的重复数据框行
【发布时间】:2019-11-21 07:59:14
【问题描述】:

我不知道如何写标题,所以希望它有点清楚。

我想要的是这个数据框和映射:

       isin        date  val
SE0000195570  2014-10-23  1
SE0000195570  2014-07-16  2
SE0000195570  2014-04-29  3
SE0000195570  2014-01-31  4          
SE0000191827  2018-10-19  5
SE0000191827  2018-07-11  6
SE0000191827  2018-04-20  7
SE0000191827  2018-02-16  8

mapping = {
  'SE0000195570': [1,2], 
  'SE0000191827': [4,5,6]
}

我想产生这个输出。

       isin        date   sec   val
SE0000195570  2014-10-23    1    1
SE0000195570  2014-10-23    2    1
SE0000195570  2014-07-16    1    2
SE0000195570  2014-07-16    2    2
SE0000195570  2014-04-29    1    3
SE0000195570  2014-04-29    2    3
SE0000195570  2014-01-31    1    4
SE0000195570  2014-01-31    2    4

SE0000191827  2018-10-19    4    5
SE0000191827  2018-10-19    5    5
SE0000191827  2018-10-19    6    5
SE0000191827  2018-07-11    4    6
SE0000191827  2018-07-11    5    6
SE0000191827  2018-07-11    6    6
SE0000191827  2018-04-20    4    7
SE0000191827  2018-04-20    5    7
SE0000191827  2018-04-20    6    7
SE0000191827  2018-02-16    4    8
SE0000191827  2018-02-16    5    8
SE0000191827  2018-02-16    6    8

如您所见,SE0000195570SE0000191827 的每一行都针对各自映射中的每个元素重复了一次。在某种程度上,我向主键添加了一个新列并相应地调整了框架大小。

我尝试简单地将新列 sec 添加到索引中,但这并没有任何用处。我有点坚持如何有效地做到这一点。循环可能不是一种选择,因为我的最终表格将超过一百万行。

【问题讨论】:

  • 听起来像是merge的案例

标签: python pandas


【解决方案1】:

创建 df 后进行交叉连接

s=pd.DataFrame(list(mapping.values()), index=mapping.keys()).stack().reset_index(level=0)
df.merge(s,left_on='isin',right_on='level_0')

【讨论】:

  • @ALollz 是的,我想从 for 循环创建 df,让我更新 :-)
【解决方案2】:

在听写理解和内务处理方面与 Ben 的回答类似:

m_df = (pd.concat(pd.Series(v, index=[k]*len(v)) 
                           for k,v in mapping.items()
                ).to_frame(name='sec'))

# same merge
df.merge(m_df, left_on='isin', right_index=True)

输出:

           isin        date  val  sec
0  SE0000195570  2014-10-23    1    1
0  SE0000195570  2014-10-23    1    2
1  SE0000195570  2014-07-16    2    1
1  SE0000195570  2014-07-16    2    2
2  SE0000195570  2014-04-29    3    1
2  SE0000195570  2014-04-29    3    2
3  SE0000195570  2014-01-31    4    1
3  SE0000195570  2014-01-31    4    2
4  SE0000191827  2018-10-19    5    4
4  SE0000191827  2018-10-19    5    5
4  SE0000191827  2018-10-19    5    6
5  SE0000191827  2018-07-11    6    4
5  SE0000191827  2018-07-11    6    5
5  SE0000191827  2018-07-11    6    6
6  SE0000191827  2018-04-20    7    4
6  SE0000191827  2018-04-20    7    5
6  SE0000191827  2018-04-20    7    6
7  SE0000191827  2018-02-16    8    4
7  SE0000191827  2018-02-16    8    5
7  SE0000191827  2018-02-16    8    6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 2011-03-14
    • 1970-01-01
    • 2015-12-27
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多