Skip to content

Commit 5c2e675

Browse files
committed
Fix unwanted aggregation of duplicate records
in `build_dataframe_from_csv` function Solves #1323
1 parent 7d281aa commit 5c2e675

2 files changed

Lines changed: 45 additions & 8 deletions

File tree

TM1py/Utils/Utils.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -617,14 +617,23 @@ def build_dataframe_from_csv(
617617
return df
618618

619619
# due to csv creation logic, last column is bottom dimension from the column selection
620-
df = df.pivot_table(
621-
index=tuple(df.columns[:-2]),
622-
aggfunc="sum",
623-
columns=df.columns[-2],
624-
values=df.columns[-1],
625-
dropna=True,
626-
sort=False,
627-
).reset_index()
620+
idx_cols = list(df.columns[:-2])
621+
col_col = df.columns[-2]
622+
val_col = df.columns[-1]
623+
624+
# create a unique row id within each (idx_cols + col_col) group
625+
df["_dup"] = df.groupby(idx_cols + [col_col]).cumcount()
626+
627+
df = (
628+
df.pivot(
629+
index=idx_cols + ["_dup"],
630+
columns=col_col,
631+
values=val_col,
632+
)
633+
.dropna(how="all")
634+
.reset_index()
635+
.drop(columns="_dup")
636+
)
628637

629638
# drop title on index
630639
return df.rename_axis(None, axis=1)

Tests/Utils_test.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,34 @@ def test_build_dataframe_from_csv(self):
150150

151151
pd._testing.assert_frame_equal(expected_df, df, check_column_type=False)
152152

153+
def test_build_dataframe_from_csv_shaped(self):
154+
raw_csv = "Region~Product~Measure~Value\r\n" "r1~p1~Revenue~1.0\r\n" "r1~p2~Revenue~3.0\r\n" "r2~p2~Revenue~4.0"
155+
df = build_dataframe_from_csv(raw_csv, dtype={"Revenue": float}, shaped=True)
156+
157+
expected_df = pd.DataFrame(
158+
{
159+
"Region": ["r1", "r1", "r2"],
160+
"Product": ["p1", "p2", "p2"],
161+
"Revenue": [1.00000, 3.00000, 4.00000],
162+
}
163+
)
164+
165+
pd._testing.assert_frame_equal(expected_df, df, check_column_type=False)
166+
167+
def test_build_dataframe_from_csv_shaped_with_duplicates(self):
168+
raw_csv = "Region~Product~Measure~Value\r\n" "r1~p1~Revenue~1.0\r\n" "r1~p1~Revenue~1.0\r\n" "r2~p2~Revenue~4.0"
169+
df = build_dataframe_from_csv(raw_csv, dtype={"Revenue": float}, shaped=True)
170+
171+
expected_df = pd.DataFrame(
172+
{
173+
"Region": ["r1", "r1", "r2"],
174+
"Product": ["p1", "p1", "p2"],
175+
"Revenue": [1.00000, 1.00000, 4.00000],
176+
}
177+
)
178+
179+
pd._testing.assert_frame_equal(expected_df, df, check_column_type=False)
180+
153181
def test_build_dataframe_from_csv_with_none_element_and_none_value(self):
154182
raw_csv = "d1~d2~Value\r\n" "e1~e1~None\r\n" "e1~e2~2.0\r\n" "None~e1~3.0\r\n" "None~e2~4.0"
155183
df = build_dataframe_from_csv(raw_csv)

0 commit comments

Comments
 (0)