【问题标题】:Compare column values based on list in Pandas dataframe根据 Pandas 数据框中的列表比较列值
【发布时间】:2018-11-22 11:35:56
【问题描述】:

我有 2 个数据框如下:

df1:

ID    list     value  listA  valueA  listB   valueB
1     list1     D1    list1     D1   list1     D1
2                     list2     D1 
3     list1     D3                   list2     D3
4     list2     D1    list2     D1   list1     D3 
5     list2     D2    list2     D2   list2     D2  
6     list2     D3    list1     D3   list1     D4 

df2:

list1  list2
 D1     456
 D2     D2
 33     D31 
 D4     245
 EE     D5 
 D5     D6

我正在尝试根据以下验证生成最终的 df

-> 如果df1中list的值为list1,那么df1中“value”对应的数据应该是df2 3中list1列的值之一。

-> 如果df1中list的值为list2,那么df1中“value”对应的数据应该是df2中list2列的值之一。

预期结果df:

ID   list   value  listA  valueA  listB  valueB Error
1    list1   D1    list1     D1   list1    D1   no mismatch
2                  list2     D1                 valueA mismatch
3    list1   D3                   list2    D3   value, valueB mismatch
4    list2   D1    list2     D1   list1    D3   value,valueA&valueB mismatch
5    list2   D2    list2     D2   list2    D2   no mismatch
6    list2   D3    list1     D3   list1    D4   value, valueA mismatch

【问题讨论】:

  • 为什么要问同一个问题两次? Your previous question
  • @Sociopath - 是的,我确实将问题一分为二,因为它们处理不同的验证,只是为了避免混淆

标签: pandas dataframe


【解决方案1】:

GroupBy.transform 与带有isin 的自定义函数一起使用作为布尔掩码并通过numpy.where 设置值:

m = df1.groupby('list')['value'].transform(lambda x: x.isin(df2[x.name]))
df1['Error'] = np.where(m, 'No mismatch with df2','list mismatch with df2')
print (df1)
   ID   list value                   Error
0   1  list1    D1    No mismatch with df2
1   2  list1    D2    No mismatch with df2
2   3  list1    D3  list mismatch with df2
3   4  list2    D1  list mismatch with df2
4   5  list2    D2    No mismatch with df2
5   6  list2    D3  list mismatch with df2

【讨论】:

  • 达到预期效果
  • 当 df1 中的任何行的值为空时,代码会引发错误。错误 - “长度不匹配:预期轴有 5 个元素,新值有 6 个元素”。有什么帮助吗? @jezrael
  • @Osceria - 问题是 groupby 中排除了缺失值,解决方案是 df2 = df2.assign(missing=np.nan)m = df1['value'].groupby(df1['list'].fillna('missing')).transform(lambda x: x.isin(df2[x.name]))
  • 此更改将具有空值的行标记为“列表不匹配”。相反,它应该忽略验证中具有空值的行。- @Jezrael
  • @Osceria - 你能检查一下m1 = df1['list'].notnull() df11 = df1[m1] m = df11.groupby('list')['value'].transform(lambda x: x.isin(df2[x.name])) df1.loc[m1, 'Error'] = np.where(m, 'No mismatch with df2','list mismatch with df2') 吗?
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多