I want to loop over 4 dataframes, groupby by the same index keys.
The dataframes can contain multiple rows for each index key.
Below is what ChatGPT suggests but I want something better.
I’ve considered concatenating the dataframes, but am concerned about memory usage.
<code>import pandas as pd
import numpy as np
# Example DataFrames
np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(6, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)], names=['a', 'b']), columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.random.randn(6, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 0)], names=['a', 'b']), columns=['D', 'E', 'F'])
df3 = pd.DataFrame(np.random.randn(5, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 2), (1, 0), (1, 2), (2, 1)], names=['a', 'b']), columns=['G', 'H', 'I'])
df4 = pd.DataFrame(np.random.randn(4, 3), index=pd.MultiIndex.from_tuples([(0, 1), (0, 2), (1, 0), (2, 2)], names=['a', 'b']), columns=['J', 'K', 'L'])
# Find common keys
common_keys = set(df1.index).intersection(df2.index).intersection(df3.index).intersection(df4.index)
# Group by multi-level index
grouped1 = df1.groupby(level=['a', 'b'])
grouped2 = df2.groupby(level=['a', 'b'])
grouped3 = df3.groupby(level=['a', 'b'])
grouped4 = df4.groupby(level=['a', 'b'])
# Iterate over the common groups
for key in common_keys:
group1 = grouped1.get_group(key) if key in grouped1.groups else None
group2 = grouped2.get_group(key) if key in grouped2.groups else None
group3 = grouped3.get_group(key) if key in grouped3.groups else None
group4 = grouped4.get_group(key) if key in grouped4.groups else None
print(f"Group {key}:")
print("Group 1:")
print(group1)
print("Group 2:")
print(group2)
print("Group 3:")
print(group3)
print("Group 4:")
print(group4)
print("n")
</code>
<code>import pandas as pd
import numpy as np
# Example DataFrames
np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(6, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)], names=['a', 'b']), columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.random.randn(6, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 0)], names=['a', 'b']), columns=['D', 'E', 'F'])
df3 = pd.DataFrame(np.random.randn(5, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 2), (1, 0), (1, 2), (2, 1)], names=['a', 'b']), columns=['G', 'H', 'I'])
df4 = pd.DataFrame(np.random.randn(4, 3), index=pd.MultiIndex.from_tuples([(0, 1), (0, 2), (1, 0), (2, 2)], names=['a', 'b']), columns=['J', 'K', 'L'])
# Find common keys
common_keys = set(df1.index).intersection(df2.index).intersection(df3.index).intersection(df4.index)
# Group by multi-level index
grouped1 = df1.groupby(level=['a', 'b'])
grouped2 = df2.groupby(level=['a', 'b'])
grouped3 = df3.groupby(level=['a', 'b'])
grouped4 = df4.groupby(level=['a', 'b'])
# Iterate over the common groups
for key in common_keys:
group1 = grouped1.get_group(key) if key in grouped1.groups else None
group2 = grouped2.get_group(key) if key in grouped2.groups else None
group3 = grouped3.get_group(key) if key in grouped3.groups else None
group4 = grouped4.get_group(key) if key in grouped4.groups else None
print(f"Group {key}:")
print("Group 1:")
print(group1)
print("Group 2:")
print(group2)
print("Group 3:")
print(group3)
print("Group 4:")
print(group4)
print("n")
</code>
import pandas as pd
import numpy as np
# Example DataFrames
np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(6, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)], names=['a', 'b']), columns=['A', 'B', 'C'])
df2 = pd.DataFrame(np.random.randn(6, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 0)], names=['a', 'b']), columns=['D', 'E', 'F'])
df3 = pd.DataFrame(np.random.randn(5, 3), index=pd.MultiIndex.from_tuples([(0, 0), (0, 2), (1, 0), (1, 2), (2, 1)], names=['a', 'b']), columns=['G', 'H', 'I'])
df4 = pd.DataFrame(np.random.randn(4, 3), index=pd.MultiIndex.from_tuples([(0, 1), (0, 2), (1, 0), (2, 2)], names=['a', 'b']), columns=['J', 'K', 'L'])
# Find common keys
common_keys = set(df1.index).intersection(df2.index).intersection(df3.index).intersection(df4.index)
# Group by multi-level index
grouped1 = df1.groupby(level=['a', 'b'])
grouped2 = df2.groupby(level=['a', 'b'])
grouped3 = df3.groupby(level=['a', 'b'])
grouped4 = df4.groupby(level=['a', 'b'])
# Iterate over the common groups
for key in common_keys:
group1 = grouped1.get_group(key) if key in grouped1.groups else None
group2 = grouped2.get_group(key) if key in grouped2.groups else None
group3 = grouped3.get_group(key) if key in grouped3.groups else None
group4 = grouped4.get_group(key) if key in grouped4.groups else None
print(f"Group {key}:")
print("Group 1:")
print(group1)
print("Group 2:")
print(group2)
print("Group 3:")
print(group3)
print("Group 4:")
print(group4)
print("n")