I have Series and DataFrames where the columns and indexes do not match. To operate on them I use something like
pd.DataFrame(df1.values + df2.values * s1.values, index = s1.index, columns = df1.columns)
The dimension follow NumPy broadcasting rules and the above works. I am looking for a better way to achieve the above which would be memory efficient and fast.
NB: The index and columns are inherited from of the Pandas Object.
Sometimes the indices are from the same Object:
pd.DataFrame(df1.values + df2.values * s1.values, index = df1.index, columns = df1.columns)
Sample data:
import pandas as pd
df1 = pd.DataFrame([[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [7, 8, 9, 10]], index=[1, 2, 3, 4], columns=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame([[10, 9, 8, 7], [8, 7, 6, 5], [6, 5, 4, 3], [4, 3, 2, 1]], index=['R1', 'R2', 'R3', 'R4'], columns=['C1', 'C2', 'C3', 'C4'])
res1 = pd.DataFrame(df1.values + df2.values, index = df1.index, columns = df1.columns)
res2 = pd.DataFrame(df1.values + df2.values, index = df1.index, columns = df2.columns)
s1 = pd.Series([1, 2, 3, 4], index=['I1', 'I2', 'I3', 'I4'])
res3 = pd.DataFrame(df1.values + df2.values * s1.values, index = s1.index, columns = df2.columns)
res4 = pd.DataFrame(df1.values + df2.values * s1.values, index = df1.index, columns = df1.columns)
Expected result:
>>> res1
A B C D
1 11 11 11 11
2 11 11 11 11
3 11 11 11 11
4 11 11 11 11
>>> res2
C1 C2 C3 C4
1 11 11 11 11
2 11 11 11 11
3 11 11 11 11
4 11 11 11 11
>>> res3
C1 C2 C3 C4
I1 11 20 27 32
I2 11 18 23 26
I3 11 16 19 20
I4 11 14 15 14
>>> res4
A B C D
1 11 20 27 32
2 11 18 23 26
3 11 16 19 20
4 11 14 15 14
Undesirable results when using shorter expression:
df1 + df2
A B C C1 C2 C3 C4 D
1 NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN
R1 NaN NaN NaN NaN NaN NaN NaN NaN
R2 NaN NaN NaN NaN NaN NaN NaN NaN
R3 NaN NaN NaN NaN NaN NaN NaN NaN
R4 NaN NaN NaN NaN NaN NaN NaN NaN
df1 + df2 * s1
A B C C1 C2 C3 C4 D I1 I2 I3 I4
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
R1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
R2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
R3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
R4 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN