我有一个看起来有点像这样的数据集:
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"])
然后连接字符串,因为缺少的值是空字符串,但没有运气。
这些数据已被网站删除,因此他们不得不经常进行大量清理工作。我想不出一个优雅的方法来解决这个问题!
答案 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]
])
答案 1 :(得分:0)
我将描述一种算法:
df.notnull()
。df.Name.unique()
中的每个名称:
df[df.Name == name]
作为工作集。[True, True, False]
和[False, False, True]
,因此总和为[1, 1, 1]
。但是这里有很多可能的边缘情况,例如如果你有三行A,B,C你该怎么做,你可以合并A + B或A + C.如果您可以在实现合并算法之前缩小数据中存在的约束,将会有所帮助。