diff --git a/src/DataFrame/IO/CSV.hs b/src/DataFrame/IO/CSV.hs index 23cca806..c4bcbd50 100644 --- a/src/DataFrame/IO/CSV.hs +++ b/src/DataFrame/IO/CSV.hs @@ -237,10 +237,14 @@ ghci> D.readSeparated (D.defaultReadOptions { columnSeparator = ';' }) ".\/data\ @ -} readSeparated :: ReadOptions -> FilePath -> IO DataFrame -readSeparated !opts !path = do - let sep = columnSeparator opts +readSeparated opts !path = do let stripUtf8Bom bs = fromMaybe bs (BL.stripPrefix "\xEF\xBB\xBF" bs) csvData <- stripUtf8Bom <$> BL.readFile path + decodeSeparated opts csvData + +decodeSeparated :: ReadOptions -> BL.ByteString -> IO DataFrame +decodeSeparated !opts csvData = do + let sep = columnSeparator opts let decodeOpts = Csv.defaultDecodeOptions{Csv.decDelimiter = fromIntegral (ord sep)} let stream = CsvStream.decodeWith decodeOpts Csv.NoHeader csvData diff --git a/src/DataFrame/Operations/Aggregation.hs b/src/DataFrame/Operations/Aggregation.hs index 68e32161..6d9fdb2d 100644 --- a/src/DataFrame/Operations/Aggregation.hs +++ b/src/DataFrame/Operations/Aggregation.hs @@ -53,6 +53,12 @@ groupBy names df (T.pack $ show $ names L.\\ columnNames df) "groupBy" (columnNames df) + | nRows df == 0 = + Grouped + df + names + VU.empty + (VU.fromList [0]) | otherwise = Grouped df diff --git a/tests/Operations/Aggregations.hs b/tests/Operations/Aggregations.hs index 6e9a2df0..d43b0ae8 100644 --- a/tests/Operations/Aggregations.hs +++ b/tests/Operations/Aggregations.hs @@ -133,6 +133,24 @@ reduceAggregationOfUnaggregatedBinaryOp = ) ) +aggregationOnNoRows :: Test +aggregationOnNoRows = + TestCase + ( assertEqual + "Aggregation on DataFrame with no rows" + ( D.fromNamedColumns + [ ("test1", DI.fromList ([] :: [Int])) + , ("sum(test2)", DI.fromList ([] :: [Int])) + ] + ) + ( testData + & D.drop 12 + & D.groupBy ["test1"] + & D.aggregate + [F.sum (F.col @Int "test2") `as` "sum(test2)"] + ) + ) + tests :: [Test] tests = [ TestLabel "foldAggregation" foldAggregation @@ -149,4 +167,7 @@ tests = , TestLabel "reduceAggregationOfUnaggregatedBinaryOp" reduceAggregationOfUnaggregatedBinaryOp + , TestLabel + "aggregationOnNoRows" + aggregationOnNoRows ]