Как объединить два двумерных кадра данных в мультииндексированный многомерный кадр данных панд? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть два фрейма данных одинакового размера, как показано ниже:

cost_type1 = pd.DataFrame([[1,2,3,4], [100,200,300,400]]).transpose()
cost_type2 = pd.DataFrame([[1,4,9,25], [10,40,90,250]]).transpose()

Поскольку оба фрейма данных связаны с затратами, я бы хотел объединить их в одну структуру, чтобы я мог сказать,что-то вроде cost [i] и получить матрицу затрат для типа i.

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

timestamps =["2014-01-01", "2014-02-01"]
categories = ["A", "B","C","D"]
idx = pd.MultiIndex.from_product([timestamps,categories], names=["ts", 
"cat"])
df = pd.DataFrame(index=idx, columns=["col1", "col2"])

Я получил хороший пустой фрейм данных, подобный этому: (out)

               col1 col2
ts         cat          
2014-01-01 A    NaN  NaN
           B    NaN  NaN
           C    NaN  NaN
           D    NaN  NaN
2014-02-01 A    NaN  NaN
           B    NaN  NaN
           C    NaN  NaN
           D    NaN  NaN

Однако мне не удается заполнить «большой» фрейм данных двумя «меньшими», которые у меня уже есть.Я пробовал что-то подобное, но у меня ничего не получилось:

df.loc["2014-01-01",:] = newdf1
df.loc["2014-02-01",:] = newdf2

Кто-нибудь из вас знает, как решить эту проблему?Спасибо!

1 Ответ

0 голосов
/ 14 декабря 2018

Используйте concat с созданием нового индекса для каждого DataFrame, поэтому пустой DataFrame не требуется:

timestamps = ["2014-01-01", "2014-02-01"]
categories = ["A", "B","C","D"]
idx = pd.MultiIndex.from_product([timestamps,categories], names=["ts", "cat"])

df = pd.concat([cost_type1.set_index([categories]), 
                cost_type2.set_index([categories])], keys=timestamps)
df.columns=["col1", "col2"]
df.index.names=['ts','cat']

Если входные данные list of DataFrames, используйте понимание списка:

dfs = [cost_type1, cost_type2]
df = pd.concat([x.set_index([categories]) for x in dfs], keys=timestamps)
df.columns=["col1", "col2"]
df.index.names=['ts','cat']
print (df)
                col1  col2
ts         cat            
2014-01-01 A       1   100
           B       2   200
           C       3   300
           D       4   400
2014-02-01 A       1    10
           B       4    40
           C       9    90
           D      25   250
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...