python-3.x - 如何检查熊猫数据框组是否具有相同的数据
问题描述
我有一个熊猫数据框如下
id name Base field1 field2 field3
1 AA Y Yes Consumer Not Applicable
1 BB N Yes Consumer Not Applicable
2 CC Y Yes Consumer Not Applicable
2 DD N Yes Not Applicable Not Applicable
2 EE N No Not Applicable Modified
3 FF Y Yes Not Applicable Applicable
3 GG N Yes Not Applicable Not Applicable
3 HH N Yes Not Applicable Not Applicable
预期的结果是根据ID列对这个dataframe进行分组,并检查所有其他列上的数据是否是每个组中的相同数据,最后写入结果。
我试过这个来验证每个组的数据,但它总是说 TRUE
代码:
result_list=[]
for col in df.columns:
result = df.groupby(level=0)[col].apply(lambda x: len(set(x))==1)
result_list.append(result)
final = pd.concat(result_list,1)
预期的结果是
id name field1 field2 field3 Error
1 AA Yes Consumer Not Applicable Pass
1 BB Yes Consumer Not Applicable Pass
2 CC Yes Consumer Not Applicable field1, field2, field3 mismatch for ID: 2
2 DD Yes Not Applicable Not Applicable field1, field2, field3 mismatch for ID: 2
2 EE No Not Applicable Modified field1, field2, field3 mismatch for ID: 2
3 FF Yes Not Applicable Applicable field3 mismatch for ID: 3
3 GG Yes Not Applicable Not Applicable field3 mismatch for ID: 3
3 HH Yes Not Applicable Not Applicable field3 mismatch for ID: 3
对此有什么帮助吗?
解决方案
您可以使用代码得到您想要的(假设df
具有名为 的索引id
):
def handler(df):
for col in ['field1', 'field2', 'field3']:
if df.loc[:, col].nunique() > 1:
return 'error in {} for id {}'.format(col, df.index[0])
else:
return 'pass'
result = df.groupby(level=0).apply(handler)
result = df.reset_index().merge(result.to_frame().reset_index(), on='id')
result
是:
id name field1 field2 field3 0
0 1 AA Yes Consumer Not Applicable pass
1 1 BB Yes Consumer Not Applicable pass
2 2 CC Yes Consumer Not Applicable error in field1 for id 2
3 2 DD Yes Not Applicable Not Applicable error in field1 for id 2
4 2 EE No Not Applicable Modified error in field1 for id 2
5 3 FF Yes Not Applicable Applicable error in field3 for id 3
6 3 GG Yes Not Applicable Not Applicable error in field3 for id 3
7 3 HH Yes Not Applicable Not Applicable error in field3 for id 3
编辑- 处理程序中的次要版本
def handler(df):
cols = list()
for col in ['field1', 'field2', 'field3']:
if df.loc[:, col].nunique() > 1:
cols.append(col)
if cols:
return 'error in {} for id {}'.format(', '.join(cols), df.index[0])
else:
return 'pass'
推荐阅读
- r - 如何将函数应用于数据集向量的每个元素,然后返回该向量?
- firebase - 当父集合不存在时,拒绝在firestore中创建集合项的适当方法?
- json - 快速使用 JSON 数据填充选择器视图的最佳方法是什么?
- javascript - Type-GraphQL:使用 @Authorized() 装饰器允许文档所有者和管理员/版主访问
- python-3.x - 在 python 计算器中处理负整数输入的最佳方法是什么?
- python-3.x - 使用字典值在for循环中生成数据框后如何查找数据框?
- java - 如何在 JPA 中修复生成的表中的排序。我们是否有一些没有任何框架的解决方法?
- python - 以下代码中的未知缩进错误
- node.js - Heroku 产生错误 H10 并导致应用程序崩溃
- javascript - javascript iframe 播放视频