如果某些值是blan,Python Pandas会合并行

2024-10-01 15:33:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集看起来有点像这样:

ID   Name            Address      Zip    Cost
1    Bob the Builder 123 Main St  12345  
1    Bob the Builder                     $99,999.99
2    Bob the Builder 123 Sub St   54321  $74,483.01
3    Nigerian Prince Area 51      33333  $999,999.99
3    Pinhead Larry   Las Vegas    31333  $11.00
4    Fox Mulder      Area 51             $0.99

丢失的数据是可以的,除非很明显它们可以合并。我的意思是,与上面的数据集不同,我想合并ID和Name相同的行,其他特性可以填补彼此的空白。例如,上面的数据集将变成:

^{pr2}$

我考虑过使用df.groupby(["ID", "Name"])然后连接字符串,因为缺少的值是空字符串,但是没有成功。在

他们已经清理了很多网站。我想不出一个优雅的方法来解决这个问题!在


Tags: the数据字符串nameidmainaddressbuilder
2条回答

我将描述一个算法:

  1. 将填充所有字段的所有行放在一边。我们不需要碰这些。在
  2. 创建一个类似输入的布尔数据帧,其中空字段为False,填充字段为True。这是df.notnull()。在
  3. 对于df.Name.unique()中的每个名称:
    1. df[df.Name == name]作为工作集。在
    2. 对布尔行的每对(或元组)求和,得到的布尔向量与输入列的宽度相同,但始终填充的列除外。在本例中,这意味着[True, True, False]和{},因此总和是[1, 1, 1]。在
    3. 如果任意位置的和等于1,则可以合并该对(或元组)行。在

但是这里有很多可能的边缘情况,例如如果你有三行a,B,C,你可以合并a+B或a+C怎么办。如果你能在实现合并算法之前缩小数据中存在的约束,这将有帮助。在

这只适用于我们可能合并的行彼此相邻的情况。在

设置

df = pd.DataFrame(dict(
        ID=[1, 1, 2, 3, 3, 4],
        Name=['Bob the Builder'] * 3 + ['Nigerian Prince', 'Pinhead Larry', 'Fox Mulder'],
        Address=['123 Main St', '', '123 Sub St', 'Area 51', 'Las Vegas', 'Area 51'],
        Zip=['12345', '', '54321', '33333', '31333', ''],
        Cost=['', '$99,999.99', '$74,483.01', '$999.999.99', '$11.00', '$0.99']
    ))[['ID', 'Name', 'Address', 'Zip', 'Cost']]

填补缺失
replace('', np.nan)然后向前填充,然后反向填充

^{pr2}$

concat
如果填充的最后一行是重复行,则取最后一行 如果没有重复,则取非填充df

pd.concat([
        df_[df_.duplicated()],
        df.loc[df_.drop_duplicates(keep=False).index]
    ])

enter image description here

相关问题 更多 >

    热门问题