【发布时间】: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 替换空字符串,然后反向分解并尝试将它们替换回空字符串,但没有成功。
【问题讨论】:
-
Col3、Col4 和 Col5 的预期输出是整数列表,还是没有? Col3 的第一行应该是 [1,2,3],Col3 的最后一行应该是 None?
-
嗨,杰森,感谢您的帮助。为了这个问题,请您将数字解释为字符串。所以 Col3 将是 ['1','2','3'] 并且我希望它是最后一行和空字符串,而不是 Nan 或 None。
标签: python pandas dataframe exploded