Панды получают новый столбец из строк нескольких столбцов (где записи являются списками) - PullRequest
0 голосов
/ 03 января 2019

У меня есть словарь, который я хотел бы превратить в кадр данных, а затем объединить некоторые столбцов этого кадра данных в один столбец.

мой словарь выглядит следующим образом:

mydict = {'Participants': {'source': ['1', '2', '3'],
                           'name': ['A', 'B', 'C'],
                           'Entry (1)': ['Address1', 'Address2', 'Address3'],
                           'Entry (2)': ['Number1', 'Number2', 'Number2'],
                           'Entry (3)': ['Start1', 'Start2', 'Start3']},
            'Countries': {'DK': ['1', '2', '3'],
                      'UK': ['1', '3', '2'],
                      'CDN': ['3', '2', '1'],
                      'FR': ['1', '2', '3']}}

и результирующий кадр данных выглядит следующим образом: df = pd.DataFrame(mydict)

df:

           Countries                    Participants
CDN        [3, 2, 1]                             NaN
DK         [1, 2, 3]                             NaN
Entry (1)        NaN  [Address1, Address2, Address3]
Entry (2)        NaN     [Number1, Number2, Number2]
Entry (3)        NaN        [Start1, Start2, Start3]
FR         [1, 2, 3]                             NaN
UK         [1, 3, 2]                             NaN
name             NaN                       [A, B, C]
source           NaN                       [1, 2, 3]

У меня есть несколько столбцов "Entry (n)", которые содержат "Address,Номер и старт "информация для каждого участника (df['Participants']['name']).Теперь мне нужен дополнительный столбец «Записи», который объединяет для каждой строки информацию Entry (1), Entry (2) и Entry(3).Так как количество записей (Entry (n) варьируется от источника данных к источнику данных, мне нужно получить количество записей, например:

entries = re.findall(r'Entry \(\d\)', str(mydict['Participants'].keys()))

, что оставляет меня со спискомвсе записи: ['Entry (1)', 'Entry (2)', 'Entry (3)'].

В конце я хотел бы получить такой фрейм данных:

           Countries                    Participants
CDN        [3, 2, 1]                             NaN
DK         [1, 2, 3]                             NaN
Entry (1)        NaN  [Address1, Address2, Address3]
Entry (2)        NaN  [Number1, Number2, Number2]
Entry (3)        NaN  [Start1, Start2, Start3]
Entries          Nan  ['Address1\nNumber1\Start1', 'Address2\nNumber2\Start2', 'Address3\nNumber3\nStart3']  <<-- I need this
FR         [1, 2, 3]                             NaN
UK         [1, 3, 2]                             NaN
name             NaN                       [A, B, C]
source           NaN                       [1, 2, 3]

Может кто-нибудь подскажет, пожалуйста, какой конкретный способ для панды достичь?это?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Давайте попробуем это:

df.at ['Записи', 'Участники'] = ['\ n'.join (i) для i in (zip (* df.loc [['Entry (1)', 'Entry (2)', 'Entry (3)'], 'Участники']))]

Заимствовано из решения @WB с использованием фильтра вместо спискаиндексы:

df.at['Entries','Participants'] = ['\n'.join(i) for i in (zip(*df.filter(like='Entry', axis=0)['Participants']))]
df.sort_index()

Вывод:

                                                Participants  Countries
CDN                                                      NaN  [3, 2, 1]
DK                                                       NaN  [1, 2, 3]
Entries    [Address1\nNumber1\nStart1, Address2\nNumber2\...        NaN
Entry (1)                     [Address1, Address2, Address3]        NaN
Entry (2)                        [Number1, Number2, Number2]        NaN
Entry (3)                           [Start1, Start2, Start3]        NaN
FR                                                       NaN  [1, 2, 3]
UK                                                       NaN  [1, 3, 2]
name                                               [A, B, C]        NaN
source                                             [1, 2, 3]        NaN
0 голосов
/ 03 января 2019

Кажется, вам нужно

s=pd.DataFrame(df.filter(like='Entry',axis=0).Participants.tolist()).apply('/n'.join).tolist()
df.loc['Entries','Participants']=s
df
Out[64]: 
                                                Participants  Countries
CDN                                                      NaN  [3, 2, 1]
DK                                                       NaN  [1, 2, 3]
Entry (1)                     [Address1, Address2, Address3]        NaN
Entry (2)                        [Number1, Number2, Number2]        NaN
Entry (3)                           [Start1, Start2, Start3]        NaN
FR                                                       NaN  [1, 2, 3]
UK                                                       NaN  [1, 3, 2]
name                                               [A, B, C]        NaN
source                                             [1, 2, 3]        NaN
Entries    [Address1/nNumber1/nStart1, Address2/nNumber2/...        NaN

Обратите внимание, что вы можете добавить sort_index в конце

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...