Создание условий взаимодействия из двух фреймов данных

#python #pandas

#python #панды

Вопрос:

У меня есть два выровненных фрейма данных с фиктивными переменными. Я хотел бы умножить два и получить новый результат фрейма данных в результате взаимодействия двух с 3 строками и 6 столбцами (ItalyxJan, ItalyxFeb, ItalyxMar, ChinaxJan ..)

 # Creating the first dataframe  
df1=pd.DataFrame({"Italy":[0,0,1], 
                  "China":[1,1,0]}) 

# Creating the second dataframe with <code>Na</code> value 
df2=pd.DataFrame({"Jan":[1,0,0], 
                  "Feb":[0,1,0], 
                  "Mar":[0,0,1]}) 

df3 = df1.mul(df2.values, axis=0)
  

, но я получил сообщение об ошибке

 ValueError: Unable to coerce to DataFrame, shape must be (3, 2): given (3, 3)


##Expected outputs

df3=pd.DataFrame({"Italy*Jan":[0,0,0], 
                  "Italy*Feb":[0,0,0], 
                  "Italy*Mar":[0,0,1],
                  "China*Jan":[1,0,1],
                  "China*fe":[0,1,0],
                  "Chian*Mar":[0,0,0]}) 
  

Предложения?

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

1. каков ваш ожидаемый результат?

2. mul Оператор, который вы пытаетесь использовать, выдает эту ошибку, потому что вы пытаетесь умножить 2x3 матрицу на 3x3 матрицу. Он ожидает 3x2 матрицу.

Ответ №1:

Вы можете создавать MultiIndex.from_product и DataFrame.reindex то, и другое, поэтому возможно несколько:

 mux = pd.MultiIndex.from_product([df1.columns, df2.columns])

df1 = df1.reindex(mux, axis=1, level=0)
print (df1)
  Italy         China        
    Jan Feb Mar   Jan Feb Mar
0     0   0   0     1   1   1
1     0   0   0     1   1   1
2     1   1   1     0   0   0

df2 = df2.reindex(mux, axis=1, level=1)
print (df2)
  Italy         China        
    Jan Feb Mar   Jan Feb Mar
0     1   0   0     1   0   0
1     0   1   0     0   1   0
2     0   1   1     0   1   1
  

 df3 = df1.mul(df2, axis=0)
print (df3)
  Italy         China        
    Jan Feb Mar   Jan Feb Mar
0     0   0   0     1   0   0
1     0   0   0     0   1   0
2     0   1   1     0   0   0
  

Последнее можно сгладить MultiIndex с map помощью и join :

 df3.columns = df3.columns.map('x'.join)
print (df3)
   ItalyxJan  ItalyxFeb  ItalyxMar  ChinaxJan  ChinaxFeb  ChinaxMar
0          0          0          0          1          0          0
1          0          0          0          0          1          0
2          0          1          1          0          0          0