我正在使用用嵌套结构(有时是多层深度)编写的多个镶木地板数据集。我需要输出一个扁平的(无结构)模式。现在我能想到的唯一方法是使用 for 循环来迭代列。这是一个简单的例子,我在其中进行循环。
while len([x.name for x in df if x.dtype == pl.Struct]) > 0:
for col in df:
if col.dtype == pl.Struct:
df = df.unnest(col.name)
Run Code Online (Sandbox Code Playgroud)
这可行,也许这是唯一的方法,如果是这样,了解这一点会很有帮助。但 Polars 非常简洁,我想知道是否有一种更实用的方法可以做到这一点,而无需所有循环并将 df 重新分配给自身。
如果你有这样的 df:
df=pl.DataFrame({'a':[1,2,3], 'b':[2,3,4], 'c':[3,4,5], 'd':[4,5,6], 'e':[5,6,7]}).select([pl.struct(['a','b']).alias('ab'), pl.struct(['c','d']).alias('cd'),'e'])
Run Code Online (Sandbox Code Playgroud)
您可以通过执行以下操作来同时解除ab和的嵌套cd
df.unnest(['ab','cd'])
Run Code Online (Sandbox Code Playgroud)
如果您事先不知道列名和类型是什么,那么您可以使用如下列表理解:
[col_name for col_name,dtype in zip(df.columns, df.dtypes) if dtype==pl.Struct]
Run Code Online (Sandbox Code Playgroud)
我们现在可以将该列表理解放入 unnest 方法中。
df=df.unnest([col_name for col_name,dtype in zip(df.columns, df.dtypes) if dtype==pl.Struct])
Run Code Online (Sandbox Code Playgroud)
如果结构内部有结构,例如:
df=pl.DataFrame({'a':[1,2,3], 'b':[2,3,4], 'c':[3,4,5], 'd':[4,5,6], 'e':[5,6,7]}).select([pl.struct(['a','b']).alias('ab'), pl.struct(['c','d']).alias('cd'),'e']).select([pl.struct(['ab','cd']).alias('abcd'),'e'])
Run Code Online (Sandbox Code Playgroud)
那么我认为你无法摆脱某种 while 循环,但这可能更简洁:
while any([x==pl.Struct for x in df.dtypes]):
df=df.unnest([col_name for col_name,dtype in zip(df.columns, df.dtypes) if dtype==pl.Struct])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3630 次 |
| 最近记录: |