Разделить столбец DataFrame на два + MultiIndex - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть DataFrame потоков , представляющих людей, пересекающих границы

flows = DataFrame([[1,2],[3,4]], index=['Monday', 'Tuesday'], columns=['CZ>DE', 'HU>AT'])

         CZ>DE  HU>AT
Monday       1      2
Tuesday      3      4

Я хотел бы разбить каждый столбец на два столбца, представляющих увеличение / уменьшение страны на границу. Мой текущий код и желаемый результат - это

country_from = lambda x: x[:2]
country_to = lambda x: x[3:]
flows_from = -1*flows.copy()
flows_from.columns = pd.MultiIndex.from_tuples([(border, country_from(border)) for border in flows.columns])
flows_to = flows.copy()
flows_to.columns = pd.MultiIndex.from_tuples([(border, country_to(border)) for border in flows.columns])
country_flows = pd.concat([flows_from, flows_to], axis=1)
country_flows = country_flows.groupby(level=[0,1], axis=1).sum()

           CZ>DE    HU>AT   
           CZ DE    AT HU
Monday     -1  1     2 -2
Tuesday    -3  3     4 -4 

Это решение довольно многословно, и я подозреваю, что это можно сделать лучше. Будет ли у кого-нибудь идея?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Хорошо, после того, как вас вдохновили python / pandas: как объединить два фрейма данных в один с иерархическим индексом столбца? Я решил проблему, объединив словарь DataFrames. Имея мои оригинальные функции лямбда-картографирования

country_from = lambda x: x[:2]
country_to = lambda x: x[3:]

результат можно получить в одну строку

pd.concat({col:pd.DataFrame({country_from(col):-1*flows[col], country_to(col):flows[col]}) for col in flows.columns}, axis=1)

           CZ>DE    HU>AT   
           CZ DE    AT HU
Monday     -1  1     2 -2
Tuesday    -3  3     4 -4
0 голосов
/ 01 ноября 2018

Вы можете создавать кортежи, которые определяют уровни вашего MultiIndex:

tuples = [(i,k) for i, j in zip(flows.columns,[i.split('>') for i in flows.columns]) for k in j]

x = flows.values

Тогда:

data = np.multiply(np.tile([-1,1], x.shape), np.repeat(x, 2, axis=1))

pd.DataFrame(data=data, index=flows.index, columns=pd.MultiIndex.from_tuples(tuples))

Урожайность:

        CZ>DE    HU>AT   
           CZ DE    HU AT
Monday     -1  1    -2  2
Tuesday    -3  3    -4  4
...