Почему мой фрейм данных pandas возвращает заголовки multipe?

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я создал функцию для возврата множества переменных из электронной таблицы. Я попытался вернуться в фрейм данных pandas вместо кортежа и получил результат. Проблема в том, что он возвращает заголовки через каждую отдельную строку (см. Рисунок). Извините, если это легко исправить, я совсем новичок! Спасибо!

В:

 holdings_darray = ['01-03-2020','01-06-2020','01-07-2020','01-08-2020','01-09-2020','01-11-2020','01-14-2020','01-15-2020','01-17-2020','01-21-2020','01-22-2020','01-23-2020',
                   '01-24-2020','01-27-2020','01-28-2020','01-29-2020','01-30-2020','01-31-2020','02-04-2020']


def get_holdings_info(d):

    date = 0
    sbhmv = 0
    sbhbv = 0
    sbhs = 0

    setfhmv = 0
    setthbv = 0
    setfhs = 0

    smmhmv = 0
    smmhbv = 0
    smmhs = 0

    r = open('holdings/Holdings As Of '   d   '.csv', 'r')
    line = r.readline()
    holdings_date = line[13:21]
    date = datetime.datetime.strptime(holdings_date, "%Y%m%d")
    holdings_file = 'holdings/Holdings As Of '   d   '.csv'
    df = pd.read_csv(holdings_file, header=1)
    df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
    account_names = ["fund1", "fund2"]
    bond_name = ["Bond Paying Periodic Income"]
    money_market_name = ["Money Market Fund"]
    mutual_fund_name = ["Mutual Fund"]
    sbh = df[df["Account Name"].isin(account_names) amp; df["Security Type Name"].isin(bond_name)]

    sbhmv = sbh['Market Value'].sum()
    sbhbv = sbh['Book Value'].sum()
    sbhs = sbh['Shares'].sum()
    setfh = df[df["Account Name"].isin(account_names) amp; df["Security Type Name"].isin(mutual_fund_name)]

    setfhmv = setfh['Market Value'].sum()
    setthbv = setfh['Book Value'].sum()
    setfhs = setfh['Shares'].sum()
    smmh = df[df["Account Name"].isin(account_names) amp; df["Security Type Name"].isin(money_market_name)]

    smmhmv = smmh['Market Value'].sum()
    smmhbv = smmh['Book Value'].sum()
    smmhs = smmh['Shares'].sum()
    return pd.DataFrame({'Date': [date], 'Bond Market Value':[sbhmv], 'Bond Book Value':[sbhbv], 'Bond Shares':[sbhs], 'ETF Market Value': [setfhmv], 'ETF Book Value' : [setthbv], 'ETF Shares': [setfhs], 'Money Market Market Value':[smmhmv], 'Money Market Book Value': [smmhbv], 'Money Market Shares':[smmhs]}
                        , columns=['Date', 'Bond Market Value', 'Bond Book Value', 'Bond Shares', 'ETF Market Value', 'ETF Book Value', 'ETF Shares', 'Money Market Market Value', 'Money Market Book Value', 'Money Market Shares'])

def get_holdings_info_array():
    c = []
    for f in holdings_darray:
        c.append(get_holdings_info(f))
    return(c)

print(get_holdings_info_array())
  

изображение вывода

Ответ №1:

Ну, дело в том, что вы записываете несколько фреймов данных в свой список c . Если вы распечатаете его, он покажет вам все перечисленные фреймы данных. Вместо этого вы могли бы добавить их в один фрейм данных:

 def get_holdings_info_array():
    c = pd.DataFrame()
    for f in holdings_darray:
        c = c.append(get_holdings_info(f), ignore_index=True)
    return(c)
  

Комментарии:

1. TypeError: cannot concatenate object of type '<class 'datetime.datetime'>'; only Series and DataFrame objs are valid это то, что я получил от этого

2. ну, в таком случае ваша функция, похоже, не возвращает фрейм данных .. можете ли вы показать мне, что именно get_holdings_info(f) возвращает? И какой это тип?

Ответ №2:

привет, вы должны попробовать этот код

 df = pd.DataFrame([date,sbhmv,sbhbv,sbhs,setfhmv,setthbv,setfhs,smmhmv,smmhbv,smmhs])
df = df.T
df.columns =['Date',
                  'Bond Market Value',
                  'Bond Book Value',
                  'Bond Shares',
                  'ETF Market Value',
                  'ETF Book Value', 
                  'ETF Shares',
                  'Money Market Market Value',
                  'Money Market Book Value',
                  'Money Market Shares']
return df 
  

вместо :

      return pd.DataFrame({'Date': [date], 'Bond Market Value':[sbhmv], 'Bond Book Value':[sbhbv], 'Bond Shares':[sbhs], 'ETF Market Value': [setfhmv], 'ETF Book Value' : [setthbv], 'ETF Shares': [setfhs], 'Money Market Market Value':[smmhmv], 'Money Market Book Value': [smmhbv], 'Money Market Shares':[smmhs]}
                    , columns=['Date', 'Bond Market Value', 'Bond Book Value', 'Bond Shares', 'ETF Market Value', 'ETF Book Value', 'ETF Shares', 'Money Market Market Value', 'Money Market Book Value', 'Money Market Shares'])
  

Комментарии:

1. ValueError: Shape of passed values is (10, 1), indices imply (10, 10) это то, что у меня есть

2. замените columns = [«Date», …] на index = [‘Дата»,…]

Ответ №3:

Я думаю, вам нужен фрейм данных из 2 строк и 10 столбцов, отображающих значения. Поэтому вам придется использовать

 data = [date,sbhmv,sbhbv,sbhs,setfhmv,setthbv,setfhs,smmhmv,smmhbv,smmhs]
columns = ['Date','Bond Market Value','Bond Book Value','Bond Shares','ETF Market Value','ETF Book Value', 'ETF Shares','Money Market Market Value','Money Market Book Value','Money Market Shares']
df = pd.DataFrame(data, columns)
  

вместо:

 pd.DataFrame({'Date': [date], 'Bond Market Value':[sbhmv], 'Bond Book Value':[sbhbv], 'Bond Shares':[sbhs], 'ETF Market Value': [setfhmv], 'ETF Book Value' : [setthbv], 'ETF Shares': [setfhs], 'Money Market Market Value':[smmhmv], 'Money Market Book Value': [smmhbv], 'Money Market Shares':[smmhs]}
                    , columns=['Date', 'Bond Market Value', 'Bond Book Value', 'Bond Shares', 'ETF Market Value', 'ETF Book Value', 'ETF Shares', 'Money Market Market Value', 'Money Market Book Value', 'Money Market Shares'])