【问题标题】:How to reverse explode dataframe rows如何反转爆炸数据框行
【发布时间】:2021-07-06 08:26:11
【问题描述】:

我一直在努力反向爆炸我最初爆炸的数据框。我首先需要拆分和分解它,以便我可以检查此数据帧(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 方式的良好做法。

【问题讨论】:

  • Col3、Col4 和 Col5 的预期输出是整数列表,还是没有? Col3 的第一行应该是 [1,2,3],Col3 的最后一行应该是 None?
  • 嗨,杰森,感谢您的帮助。为了这个问题,请您将数字解释为字符串。所以 Col3 将是 ['1','2','3'] 并且我希望它是最后一行和空字符串,而不是 Nan 或 None。

标签: python pandas dataframe exploded


【解决方案1】:

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

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))

【讨论】:

  • 嗨@Cristina,感谢您的帮助。我刚刚尝试了你的建议,它给了我不需要的'[]',正如我的问题中所解释的那样。如下所示 Col5 有 [, ,] 我不想要和不需要的。 Col1 Col2 Col3 Col4 Col5 0 aaa eee [1, 2, 3] [1, 1, 1] [, , ] 1 bbb fff [1] [] [3] 2 ccc ggg [1, 2] [2, 2] [, ] 3 ddd hhh [] [] []
猜你喜欢
  • 2020-04-21
  • 1970-01-01
  • 2022-01-27
  • 2021-05-27
  • 2022-11-04
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多