>

내 문제 :출력 변수를 비슷한 크기의 데이터 프레임에 분리하고 병합하려고합니다.

모델 출력 : "var"

{('Product1', 0): <gurobi.Var listing[Product1,0] (value 1.0)>, ('Product1', 1): <gurobi.Var listing[Product1,1] (value 0.0)>, ('Product1', 2): <gurobi.Var listing[Product1,2] (value 0.0)>, ('Product1', 3): <gurobi.Var listing[Product1,3] (value 0.0)>, ('Product2', 0): <gurobi.Var listing[Product2,0] (value 1.0)>, ('Product2', 1): <gurobi.Var listing[Product2,1] (value 0.0)>, ('Product2', 2): <gurobi.Var listing[Product2,2] (value 0.0)>, ('Product2', 3): <gurobi.Var listing[Product2,3] (value 0.0)>, ('Product3', 0): <gurobi.Var listing[Product3,0] (value 1.0)>, ('Product3', 1): <gurobi.Var listing[Product3,1] (value 0.0)>, ('Product3', 2): <gurobi.Var listing[Product3,2] (value 0.0)>, ('Product3', 3): <gurobi.Var listing[Product3,3] (value 0.0)>}
<class 'gurobipy.tupledict'>

원하는 출력 : 원하는 출력은 다음과 같아야합니다 :

                   0    1    2    3                                
Product1          1.0  0.0  0.0  0.0
Product2          1.0  0.0  0.0  0.0
Product3          0.0  0.0  0.0  1.0
<class 'pandas.core.frame.DataFrame'>

내 (매우 수동) 시도 :

1) 출력 변수를 "df_listing"데이터 프레임으로 바꿨습니다 :

dict_listing = {k : v.X for k,v in var.items()}
df_listing = pd.DataFrame.from_dict(dict_listing, orient='index')
df_listing = df_listing.rename(columns = {0: 'listing'})
               listing
(Product1, 0)      1.0
(Product1, 1)      0.0
(Product1, 2)      0.0
(Product1, 3)      0.0
(Product2, 0)      1.0
(Product2, 1)      0.0
(Product2, 2)      0.0
(Product2, 3)      0.0
(Product3, 0)      0.0
(Product3, 1)      0.0
(Product3, 2)      0.0
(Product3, 3)      1.0
<class 'pandas.core.frame.DataFrame'>

2) "df_listing"조옮김 :

df_listing = df_listing.transpose()

3) 열 수인 k를 사용하십시오.이 경우에는 4->0,1,2,3

입니다.

df_Product1 = df_listing.iloc[:, 0*k:1*k]
df_Product1.columns = list(range(k))
df_Product2 = df_listing.iloc[:, 1*k:2*k]
df_Product2.columns = list(range(k))
df_Product3 = df_listing.iloc[:, 2*k:3*k]
df_Product3.columns = list(range(k))

4) 세 개의 데이터 프레임을 연결

input = [df_Product1, df_Product2, df_Product3]
df_facingsProductAll = pd.concat(input)

내 시도는 매우 수동 이었으므로 a) for 루프를 사용하여보다자동화 된 솔루션을 찾고 b) 입력이 될 수 있도록보다동적 코드를 가지고 있습니다 더 많은 제품, 예 : 5 개 제품

도움이되어 주셔서 감사합니다!

  • 답변 # 1

    이것으로 시도해보십시오

    import pandas as pd
    from io import StringIO
    txt = """
                   listing
    (Product1,0)      1.0
    (Product1,1)      0.0
    (Product1,2)      0.0
    (Product1,3)      0.0
    (Product2,0)      1.0
    (Product2,1)      0.0
    (Product2,2)      0.0
    (Product2,3)      0.0
    (Product3,0)      0.0
    (Product3,1)      0.0
    (Product3,2)      0.0
    (Product3,3)      1.0"""
    df = pd.read_csv(StringIO(txt), delim_whitespace=True)
    df = df.reset_index()
    # split index and concat to df
    df = pd.concat([df,
                    pd.DataFrame(df["index"].str.split(",")\
                                            .values.tolist(),
                                 columns=["a","b"])],
                    axis=1)
    df = df.drop("index", axis=1)
    # remove brackets
    df["a"] = df["a"].str[1:]
    df["b"] = df["b"].str[:-1].astype(int)
    out = pd.pivot_table(df,
                         index="a",
                         columns="b",
                         values="listing")
    
    

    출력

    b           0    1    2    3
    a                           
    Product1  1.0  0.0  0.0  0.0
    Product2  1.0  0.0  0.0  0.0
    Product3  0.0  0.0  0.0  1.0
    
    

    업데이트

    (Product1, 0) 와 같이 공백이있는 경우  다음과 같이 진행할 수 있습니다 :

    txt = """
                   listing
    (Product1, 0)      1.0
    (Product1, 1)      0.0
    (Product1, 2)      0.0
    (Product1, 3)      0.0
    (Product2, 0)      1.0
    (Product2, 1)      0.0
    (Product2, 2)      0.0
    (Product2, 3)      0.0
    (Product3, 0)      0.0
    (Product3, 1)      0.0
    (Product3, 2)      0.0
    (Product3, 3)      1.0"""
    df = pd.read_csv(StringIO(txt), delim_whitespace=True)
    df = df.reset_index()\
           .rename(columns={"level_0":"a",
                            "level_1":"b"})
    # remove brackets
    df["a"] = df["a"].str[1:-1]
    df["b"] = df["b"].str[:-1].astype(int)
    
    

  • 답변 # 2

    예제 데이터의 짧은 버전은 다음과 같습니다.

    import pandas as pd
    df = pd.DataFrame({'product': [('Product 1' , 0), ('Product 1', 1) , ('Product 2', 0), ('Product 2', 1)],
                       'listing': [1.0, 0.0, 1.0, 0.0]})
    df
    
    

    그런 다음 색인 항목을 재설정하여 제품 이름을 '색인'에서 분리하십시오.

    df['prod_indx'] = df['product'].apply(lambda x: x[1])
    df['product'] = df['product'].apply(lambda x: x[0])
    
    

    그럼 피봇

    output = pd.pivot_table(df, values='listing', columns='prod_indx', index='product', aggfunc=sum)
    print(output)
    
    

관련 자료

  • 이전 javascript - onKeyup 이벤트 myfunction이 list obj의 텍스트 상자에 입력 한대로 일치하는 예상 데이터를 반환하지 않습니다 목록에서 데이터를 필터링해야합니다
  • 다음 tableau js api - 필터에 설정된 경우 "모두"필터 값을 얻는 방법