Как получить второй заголовок в pandas-Dataframe, который был построен из списка с помощью zip () - PullRequest
1 голос
/ 18 октября 2019

Начиная с кода ниже, я хочу расширить свой код.

import pandas as pd

df_area = pd.DataFrame({"A": ["area1", "area2","area1"],
                        "B": [2, 5,7],
                        "C": ["BUS_X","BUS_Y","BUS_Y"]})
df_time = pd.DataFrame({"area1": [1000, 2000, 3000, 4000],
                        "area2": [2000, 5000, 6000, 7000]})

def do_split(df1, df2):
    return [df1[A] * B for A,B in zip(df2.A, df2.B)]

newlist = do_split(df_time, df_area)  
newframe = pd.DataFrame(newlist)    
df1_transposed = newframe.T   

Моя цель - получить столбец C из df_area в качестве второго заголовка в моем выходном кадре данных df1_transposed (картинка ниже).

enter image description here

Это означает, что BUS_X должно быть меньше area1, BUS_Y меньше area2, а второе BUS_Y ниже второгоarea1 как заголовки.

Я попытался расширить функцию следующим образом:

def do_split(df1, df2):
    return [df1[A] * B for A,B,C in zip(df2.A, df2.B,df2.C)]

Код работает без ошибок, но вывод такой же, как на рисунке выше.

1 Ответ

1 голос
/ 18 октября 2019

Использование concat:

def do_split(df1, df2):
    return [(df1[A] * B).rename((A, C)) for A,B,C in zip(df2.A, df2.B, df2.C)]

df = pd.concat(do_split(df_time, df_area), axis=1)
print (df)
  area1  area2  area1
  BUS_X  BUS_Y  BUS_Y
0  2000  10000   7000
1  4000  25000  14000
2  6000  30000  21000
3  8000  35000  28000

Лучшее / более быстрое решение:

df = df_time.mul(df_area.set_index(['A','C'])['B'], level=0)
print (df)
A area1  area2  area1
C BUS_X  BUS_Y  BUS_Y
0  2000  10000   7000
1  4000  25000  14000
2  6000  30000  21000
3  8000  35000  28000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...