Как заархивировать добавить pandas Dataframes с разными столбцами

Я хотел бы добавить два файла df в формате zip:

дф1:

        X
a   b
1   1   2
1   2   3

дф2:

   X
c
1   1
2   2

желаемый результат:

df1+df2=
           X
a   b   c
1   1   1   3
1   1   2   4
1   2   1   4
1   2   2   5

Единственная идея, которая у меня есть, это ходить по рядам, но это ужасно..

Какова логика того факта, что оба кадра данных дублируются один раз?

Erfan 19.06.2019 15:32

У каждого кадра данных есть только один столбец или несколько?

Quang Hoang 19.06.2019 15:35

@QuangHoang df1 имеет несколько индексов, а df2 — только один. Но столбцов «результатов» (X) всего три. Надеюсь, я достаточно ясно

umn 19.06.2019 15:37

@Эрфан, твой вопрос мне не ясен

umn 19.06.2019 15:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
72
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема, как сейчас, может быть решена с помощью трансляции:

# new values
new_vals = df1.X.values[:,None] + df2.X.values[None,:]

# new dataframe:
new_df = pd.DataFrame(new_vals, index=df1.index, columns=df2.index)

# stack for the multi-index:
new_df.stack()

выход:

a  b  c
1  1  1    3
      2    4
   2  1    4
      2    5
dtype: int64

Это все еще работает, если у вас есть более одного столбца, но требуется небольшая настройка столбцов new_df:

df1 = (pd.DataFrame({'a':[1,1],
                    'b':[1,2],
                    'X':[0,3],
                    'Y':[1,2]})
         .set_index(['a','b'])
      )

df2 = (pd.DataFrame({'c':[1,2,3],
                    'X':[1,2,3],
                    'Y':[0,1,5]})
         .set_index('c')
      )

new_vals = df1.values[:,None] + df2.values[None,:]

new_df = pd.DataFrame(data=new_vals.reshape(len(df1), df2.shape[1]*df2.shape[0]),
                      index=df1.index, 
                      columns=pd.MultiIndex.from_product((df2.index, df2.columns) )
                     )

Выход:

       X  Y
a b        
1 1 1  1  1
    2  2  2
    3  3  6
  2 1  4  2
    2  5  3
    3  6  7
Ответ принят как подходящий

Это легко использовать concat

pd.concat([df1+df2.loc[x] for x in df2.index],1,keys=df2.index).stack(0)
Out[267]: 
       X
a b c   
1 1 1  3
    2  4
  2 1  4
    2  5

Другое решение, создание нового MultiIndex.from_tuples из понимания списка, а затем использование DataFrame.reindex и DataFrame.add:

new_idx = pd.MultiIndex.from_tuples([x + (y,) for x in df1.index.to_flat_index()
                                     for y in df2.index], names=['a', 'b', 'c'])

df1.reindex(new_idx).add(df2)

[вне]

       X
a b c   
1 1 1  3
    2  4
  2 1  4
    2  5

Другие вопросы по теме