pandas 如何限制列到RAW转换后的RAW数量?

7lrncoxx  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(155)

我的数据是这样的:

当我在处理列到行的转换时,我找到了pandas方法DataFrame.explode()。但是'explode'会使raws增加列的不同值的倍数。在这种情况下,它意味着行数是3(Type的不同值)乘以2(Method的不同值)乘以4(Object的不同值),也就是每个标题和名称都有24行。我想要的是这样的:

对于每个标题和名称,行数是其他三个列(Type,Method,Object)的不同值的最大值。在这种情况下,它是4,而不是24。Python中有什么方法或技术可以做到这一点吗?
我发现DataFrame.explode()方法会使raws增加多个不同值的列

t9aqgxwy

t9aqgxwy1#

类似于@Timeless方法:

def explode_uneven(df, subset=[]):
    def exp_dedup(s):
        s2 = s.str.split('[.,]\s*').explode()
        idx = pd.MultiIndex.from_frame(s2.groupby(level=0, sort=False).cumcount().reset_index())
        return s2.set_axis(idx)
    keep_cols = list(df.columns.difference(subset))
    tmp = df.set_index(keep_cols, append=True)
    return pd.concat([exp_dedup(tmp[c]) for c in tmp], axis=1
                    ).reset_index(keep_cols).loc[df.index, list(df)]

# uncomment the last bit to remove the deduplication
out = explode_uneven(df, ['Type', 'Method', 'Object'])#.droplevel(-1)

输出:

Title   Name Type Method Object
level_0 0                                
0       0  xxxx    Tom  abf      A      F
        1  xxxx    Tom   fe      B      Z
        2  xxxx    Tom   fa    NaN      E
        3  xxxx    Tom  NaN    NaN      G
1       0  yyyy  Jerry   ad      A      G
        1  yyyy  Jerry   fa      C      C
        2  yyyy  Jerry  NaN      D      X
        3  yyyy  Jerry  NaN      E    NaN
vd2z7a6w

vd2z7a6w2#

以下是explode/concat的一个选项:

out = (pd.concat(
            [df.set_index(["Title", "Name"])
                 .apply(lambda x: pd.Series(x).str.split(r",\s*"))
                 .pipe(lambda df_: df_[col].explode().to_frame())
                 .assign(idx=lambda x: x.groupby(level=0).cumcount())
                 .set_index("idx", append=True) for col in ["Type", "Method", "Object"]
            ], axis=1).sort_index().droplevel(2).reset_index()
      )

输出:

print(out)

  Title   Name Type Method Object
0  xxxx    TOM  abf      A      F
1  xxxx    TOM   fe      B      Z
2  xxxx    TOM   fa    NaN      E
3  xxxx    TOM  NaN    NaN      G
4  yyyy  Jerry   ad      A      G
5  yyyy  Jerry   fa      C      C
6  yyyy  Jerry  NaN      D      X
7  yyyy  Jerry  NaN      E    NaN

相关问题