簡體   English   中英

append 列的值基於 dataframe 中另一列的值

[英]append column with values based on values of another column in the dataframe

# Sample of existing Dataframe
data = {'portfolio': ['40/60', '60/40', '80/20', '100/0']}

test_df = pd.DataFrame(data)

# print dataframe.
test_df


Output:

portfolio
40/60
60/40
80/20
100/20

我正在嘗試根據現有列中的值創建新列以包含投資組合的名稱和 model 名稱。 注意:還有其他幾行包含這些現有值/比率,它們構成了每個投資組合的完整分配。 所以我需要投資組合名稱與“投資組合”列中的相應值保持一致。 這是我在下面使用的當前代碼:

def test(df):
    column1 = []
    column2 = []
    for row in df['Portfolio']:
        if row == '40/60':
            column1.append('Portfolio 1')
            column2.append('Portfolio 1 Model')
        elif row == '60/40':
            column1.append('Portfolio 2')
            column2.append('Portfolio 2 Model')
        elif row == '80/20':
            column1.append('Portfolio 3')
            column2.append('Portfolio 3 Model')
        elif row == '100/0':
            column1.append('Portfolio 4')
            column2.append('Portfolio 4 Model')
        else:
            column1.append('N/A')
            column2.append('N/A')

    df['portfolio_name'] = column1
    df['model_name'] = column2

    return df

test(test_df)

Expected output:

portfolio.   portfolio_name.  model_name
40/60        Portfolio 1      Portfolio 1 Model
60/40        Portfolio 2      Portfolio 2 Model
80/20        Portfolio 3      Portfolio 3 Model
100/0        Portfolio 4      Portfolio 4 Model


Actual Output:

portfolio.   portfolio_name.  model_name
40/60        N/A              N/A
60/40        N/A              N/A
80/20        N/A              N/A
100/0        N/A              N/A

我只是不確定我在這里缺少什么以及為什么附加到新創建的列的值只識別“else”條件?

我認為問題出在 for 循環的可迭代中,您應該改用它:

for i, row in df['Portfolio'].items():

嘗試使用字典 map 您的值:

names = {'40/60': {'portfolio_name': 'Portfolio 1', 'model_name': 'Portfolio 1 Model'},
         '60/40': {'portfolio_name': 'Portfolio 2', 'model_name': 'Portfolio 2 Model'},
         '80/20': {'portfolio_name': 'Portfolio 3', 'model_name': 'Portfolio 3 Model'},
         '100/0': {'portfolio_name': 'Portfolio 4', 'model_name': 'Portfolio 4 Model'},}

df = df.join(df['Portfolio'].map(names).dropna().apply(pd.Series))
print(df)

# Output
  Portfolio portfolio_name         model_name
0     40/60    Portfolio 1  Portfolio 1 Model
1     60/40    Portfolio 2  Portfolio 2 Model
2     80/20    Portfolio 3  Portfolio 3 Model
3     100/0    Portfolio 4  Portfolio 4 Model
4     50/50            NaN                NaN

設置:

data = {'Portfolio': ['40/60', '60/40', '80/20', '100/0', '50/50']}
df = pd.DataFrame(data)
data = {'portfolio': ['40/60', '60/40', '80/20', '100/0']}
df = pd.DataFrame(data)
df['portfolioName'] = "portfolio " + df.index.map(str)
df['modelName'] = "portfolio " + df.index.map(str) + " Model"
df = df.set_index('portfolio')

結果如下

   portfolio  portfolioName   modelName
        
    40/60     portfolio 0     portfolio 0 Model
    60/40     portfolio 1     portfolio 1 Model
    80/20     portfolio 2     portfolio 2 Model
    100/0     portfolio 3     portfolio 3 Model

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM