0

我一直在努力扭转我最初爆炸的数据框。我首先需要拆分和分解它,以便我可以检查此数据帧(df1)中的每个值是否存在于其他数据帧(df2)中。有些列包含分号分隔的字符串,所以我需要将它们拆分,以便我可以在 df2 上一一检查它们的可用性。我见过类似的问题,我尝试过他们的解决方案,但这些问题的数据框没有空单元格(空字符串)。

原始 df1 示例(爆炸前):

在此处输入图像描述

爆炸后:

在此处输入图像描述

from itertools import product, chain
import pandas as pd

explode_rows = chain.from_iterable(product([Col1], [Col2], Col3.split(;), Col4.split(;), Col5.split(;)) 
            for Col1, Col2, Col3, Col4, Col5 in df1.to_numpy())
df1 = pd.DataFrame(explode_rows, columns = df1.columns)

现在我需要反向分解这个拆分列的值,以便我可以轻松地在不需要的地方一次用列表 ['a','b','c'] 过滤 df2。

这是我试图扭转爆炸时得到的。col3,4,5 将有空单元格,如本例所示。但是我在这个空单元格中总是有 []、['']、''、'' 之类的东西,当我尝试过滤 df2 时,我不想要这些东西,这些东西被使用并且无法用它们过滤。所以我需要反转爆炸并让空单元格保持原样。请注意,这个空单元格实际上有空字符串而不是 Nan。

这是我尝试过的一些事情,但几乎给了我与下面相同的输出。

df1 = df1.groupby(['Col1','Col2'], as_index=False).agg(list)


df1 = (df1.groupby(['Col1','Col2'])
        .agg(Col3=('Col3', ','.join(),
             Col4=('Col4', ','.join),
             Col5=('Col5', ','.join),)
        .reset_index())
    

df1 = df1.groupby(['Col1','Col2'], as_index=False).agg(list)


df1 = (df1.groupby(['Col1','Col2'])
        .agg(Col3=('Col3', ','.join(),
             Col4=('Col4', ','.join),
             Col5=('Col5', ','.join),)
        .reset_index())
        

df1 = (df1.groupby([['Col1','Col2'])
      .agg({'Col3': lambda x: x.tolist(),
            'Col4': lambda x: x.tolist(),
            'Col3': lambda x: x.tolist(),})
      .reset_index())

我试图用 Nan 替换空字符串,然后反向爆炸并尝试将它们替换回空字符串,但没有运气。

在此处输入图像描述 任何帮助将不胜感激,以及我可以为您提供高效和干净的 Python 方式的良好实践。

4

1 回答 1

0

一个简单的解决方案是继续:

df1['Col3'] == df1['Col3'].apply(lambda x: ';'.join(x))
df1['Col4'] == df1['Col4'].apply(lambda x: ';'.join(x))
df1['Col5'] == df1['Col5'].apply(lambda x: ';'.join(x))
于 2021-07-06T08:39:19.037 回答