Python Pandas - 如果某些值为空,则合并行

时间:2016-11-22 03:39:11

标签: python pandas dataframe duplicates

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

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和名称相同的行,其他功能可以填充彼此的空白。例如,上面的数据集将变为:

ID   Name            Address      Zip    Cost
1    Bob the Builder 123 Main St  12345  $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

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

这些数据已被网站删除,因此他们不得不经常进行大量清理工作。我想不出一个优雅的方法来解决这个问题!

2 个答案:

答案 0 :(得分:1)

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

设置

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)然后转发填充然后回填

df_ = df.replace('', np.nan).ffill().bfill()

<强> 的concat
如果填充了df_的最后一行,如果它是一个重复的行 如果没有重复,请填写未填写的df

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

enter image description here

答案 1 :(得分:0)

我将描述一种算法:

  1. 将所有填充所有字段的所有行放在一边。我们不需要触摸它们。
  2. 创建一个布尔数据框架,如输入,其中空字段为False,填充字段为True。这是df.notnull()
  3. 对于df.Name.unique()中的每个名称:
    1. df[df.Name == name]作为工作集。
    2. 对布尔行的每对(或元组)求和,得到一个布尔向量,其宽度与输入列相同,但总是填充的那些。在示例中,这意味着[True, True, False][False, False, True],因此总和为[1, 1, 1]
    3. 如果总和在任何地方等于1,则可以合并该行(或元组)行。
  4. 但是这里有很多可能的边缘情况,例如如果你有三行A,B,C你该怎么做,你可以合并A + B或A + C.如果您可以在实现合并算法之前缩小数据中存在的约束,将会有所帮助。