Я хотел бы добавить два файла 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
Единственная идея, которая у меня есть, это ходить по рядам, но это ужасно..
У каждого кадра данных есть только один столбец или несколько?
@QuangHoang df1
имеет несколько индексов, а df2
— только один. Но столбцов «результатов» (X
) всего три. Надеюсь, я достаточно ясно
@Эрфан, твой вопрос мне не ясен
Проблема, как сейчас, может быть решена с помощью трансляции:
# 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
Какова логика того факта, что оба кадра данных дублируются один раз?