Повторяющаяся строка данных для каждой строки, которая соответствует отображению dict - PullRequest
1 голос
/ 11 июля 2019

Я не был уверен, как произнести название, так что, надеюсь, это несколько понятно.

Что мне нужно, так это с этим фреймом данных и отображением:

       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

Как видите, каждая строка для SE0000195570 и SE0000191827 была повторена один раз для каждого элемента в их соответствующих сопоставлениях. В некотором смысле, я добавил новый столбец к первичному ключу и соответственно изменил размер кадра.

Я попытался просто добавить новый столбец sec в индекс, но это не помогло. Я застрял на том, как сделать это эффективно. Зацикливание, вероятно, не вариант, так как моя последняя таблица пройдет более миллиона строк.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Аналогично ответу Бена с пониманием и ведением домашнего хозяйства:

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
1 голос
/ 11 июля 2019

Сделать с перекрестным соединением после создания 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...