아래 코드부터 시작하여 코드를 확장하고 싶습니다.
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
내 출력 Dataframe에 두 번째 헤더로 df1_transposed
(아래 그림).
이는 헤더 BUS_X
로 under area1
, BUS_Y
under 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)]
그러면 코드가 오류없이 작동하지만 출력은 위 그림과 동일합니다.
사용 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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다