我希望能够连接polars
中的 Dataframe ,其中 Dataframe 具有相同的列,但一些 Dataframe 没有列子集的数据。
更准确地说,我在寻找这个pandas
最小工作示例的polars
等价物:
from io import StringIO
import polars as pl
import pandas as pd
TESTDATA1 = StringIO("""
col1,col2,col3
1,1,"a"
2,1,"b"
"""
)
TESTDATA2 = StringIO("""
col1,col2,col3
1,,"a"
2,,"b"
"""
)
df = pd.concat(
[
pd.read_csv(TESTDATA1),
pd.read_csv(TESTDATA2),
],
)
print(df)
这个打印
col1 col2 col3
0 1 1.0 a
1 2 1.0 b
0 1 NaN a
1 2 NaN b
我尝试了以下polars
实现,但不适用:
TESTDATA1 = StringIO("""
col1,col2,col3
1,1,"a"
2,1,"b"
""")
TESTDATA2 = StringIO("""
col1,col2,col3
1,,"a"
2,,"b"
""")
df = pl.concat(
[
pl.read_csv(TESTDATA1),
pl.read_csv(TESTDATA2),
],
how ="diagonal"
)
我收到错误消息:
SchemaError: cannot vstack: because column datatypes (dtypes) in the two DataFrames do not match for left.name='col2' with left.dtype=i64 != right.dtype=str with right.name='col2'
似乎空列被视为polars
中的str
,并且不能与类型为i64
的其他 Dataframe 合并。
我知道这是我的问题的解决方案:
df = pl.concat(
[
pl.read_csv(TESTDATA1),
pl.read_csv(TESTDATA2).with_columns(pl.col("col2").cast(pl.Int64)),
],
how ="diagonal"
)
但实际上,我有大约20个列可能是null
,我不想强制转换所有列。
在pandas
和polars
中起作用的是从 Dataframe 中删除空列的情况,即
TESTDATA1 = StringIO("""
col1,col2,col3
1,1,"a"
2,1,"b"
""")
TESTDATA2 = StringIO("""
col1,col3
1,"a"
2,"b"
""")
pl.concat(
[
pl.read_csv(TESTDATA1),
pl.read_csv(TESTDATA2),
],
how ="diagonal"
)
在pandas
中,我也可以通过调用.dropna(how="all",axis=1)
来删除空列,但我不知道在polars
中的等效方法。
所以,总结一下:
- 如果
polars
中的一些 Dataframe 包含没有数据的列(null
),我如何在polars
中连接 Dataframe ? - 如何在
polars
中实现与.dropna(how="all",axis=1)
的等效?
谢谢!
2条答案
按热度按时间nkcskrwz1#
也许有一种更直接的方法--您可以循环遍历每个
.schema
并构建自己的“超类型”模式。您可以使用它来生成强制类型转换信息。
要删除
null
列,可以选择任何值都不为空的列.drop
需要字符串-因此您可以afdcj2ne2#
很抱歉造成了混淆。pl.concat()的how参数只支持“vertical”、“diagonal”和“horizontal”,这是正确的。排除所有值为空的行的正确参数是drop_rows。
下面是一个更新的示例:
关于drop_nulls()中的axis参数,Polars中不存在该参数,这是正确的,但可以使用subset参数传递列的子集来检查空值。
下面是一个更新的示例:
我为我之前的回复引起的任何混乱道歉。如果你有任何进一步的问题,请让我知道。