如何使用Polars扫描多个缺少列的CSV文件(一些)?

i86rm4rw  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(129)

我尝试使用Polars库扫描多个CSV文件,并从每个文件中选择一组列。但是,某些CSV文件缺少我想要选择的某些列。有没有办法处理这种情况,用None值或其他默认值填充缺少的列?

queries = pl.LazyFrame()

for file in glob.glob("*.csv"):
    q = pl.scan_csv(file, ignore_errors=True ).select(
           ['Date','ID', 'colA','Column A','columnA'])

    queries=pl.concat([queries, q], how="diagonal")
 

dataframes = pl.collect_all(queries)

字符串

mhd8tkvw

mhd8tkvw1#

您可以将.select()移动到collect之前的最后一个操作:

columns = "a", "b", "c", "d"

dfs = [
   pl.scan_csv(file, ignore_errors=True)
   for file in glob.glob("*.csv")
]

pl.concat(dfs, how="diagonal").select(columns).collect()

个字符
至于添加缺失的列,我不确定除了“手动”确定差异之外是否还有其他方法:

columns = "a", "b", "c", "d"

dfs = (
   df.with_columns(**missing).select(columns)
   for file    in glob.glob("*.csv")
   for df      in [ pl.scan_csv(file, ignore_errors=True) ]
   for diff    in [ set(columns).difference(df.columns) ]
   for missing in [ dict.fromkeys(diff) ]
)

pl.concat(dfs, how="vertical_relaxed").collect()
shape: (5, 4)
┌──────┬──────┬──────┬──────┐
│ a    ┆ b    ┆ c    ┆ d    │
│ ---  ┆ ---  ┆ ---  ┆ ---  │
│ i64  ┆ i64  ┆ i64  ┆ i64  │
╞══════╪══════╪══════╪══════╡
│ 1    ┆ 2    ┆ null ┆ null │
│ 4    ┆ 5    ┆ 6    ┆ null │
│ null ┆ null ┆ 3    ┆ 5    │
│ null ┆ 7    ┆ 8    ┆ 9    │
│ null ┆ 10   ┆ 11   ┆ 12   │
└──────┴──────┴──────┴──────┘

dict.fromkeys()构建名称和“null”以添加为缺失列:

>>> dict.fromkeys(["c", "d"])
{'c': None, 'd': None}


dtypes将有所不同,在这种情况下,您可以使用vertical_relaxed策略。

相关问题