【问题标题】:Delete series value from row of a pandas data frame based on another data frame value根据另一个数据框值从熊猫数据框的行中删除系列值
【发布时间】:2018-01-14 12:50:27
【问题描述】:

我的问题与here发布的问题有点不同

所以我想开一个新线程。我有一个带有 5 个属性的 pandas 数据框。其中一个属性是使用 pandas 系列创建的。这是创建数据框的示例代码

import numpy as np
mydf1=pd.DataFrame(columns=['group','id','name','mail','gender'])
data = np.array([2540948, 2540955, 2540956,2540956,7138932])
x=pd.Series(data)    
mydf1.loc[0]=[1,x,'abc','abc@xyz.com','male']

我有另一个数据框,创建数据框的代码如下

mydf2=pd.DataFrame(columns=['group','id'])
data1 = np.array([2540948, 2540955, 2540956])
y=pd.Series(data1)
mydf2.loc[0]=[1,y]

这些是样本数据。实际数据将有大量行,并且系列长度也很大。我想将 mydf1 与 mydf2 匹配,如果匹配,有时我不会在 mydf2 中有匹配的元素,那么我将从那里的 mydf1 中删除 id 的值例如,在 mydf2 中,运行后,我的 id 将是组 1 2540956,7138932。我还尝试了上面链接中提到的代码。但是对于第一行

counts = mydf1.groupby('id').cumcount()

我收到错误消息 TypeError:“系列”对象是可变的,因此它们不能被散列 在我的 Python 3.X 中。你能建议我如何解决这个问题吗?

【问题讨论】:

  • 有什么建议吗?
  • 我非常需要它。如果有人能建议我一个解决方案,我会很高兴
  • 您能否提供更多数据...我无法从您的描述中看出您想要什么。
  • 你怎么搭配?标准是什么?你是按组还是按 id 匹配?
  • 谢谢@Tai,我一定会让你知道的

标签: python pandas


【解决方案1】:

这应该可行。我们使用Counter 来查找 2 个 id 列表之间的差异。 (p.s.这个问题不需要区分顺序。)

设置

import numpy as np
from collections import Counter
mydf1=pd.DataFrame(columns=['group','id','name','mail','gender'])
x = [2540948, 2540955, 2540956,2540956,7138932]
y = [2540948, 2540955, 2540956,2540956,7138932]
mydf1.loc[0]=[1,x,'abc','abc@xyz.com','male']
mydf1.loc[1]=[2,y,'def','def@xyz.com','female']

mydf2=pd.DataFrame(columns=['group','id'])
x2 = np.array([2540948, 2540955, 2540956])
y2 = np.array([2540955, 2540956])
mydf2.loc[0]=[1,x2]
mydf2.loc[1]=[2,y2]

代码

mydf3 = mydf1[["group", "id"]]
mydf3 = mydf3.merge(mydf2, how="inner", on="group")

new_id_finder = lambda x: list((Counter(x.id_x) - Counter(x.id_y)).elements())

mydf3["new_id"] = mydf3.apply(new_id_finder, 1)
mydf3["new_id"]
    group   new_id
0   1       [2540956, 7138932]
1   2       [2540948, 2540956, 7138932]

一个Counter 对象可以substract 另一个对象来获取元素出现的差异。然后,您可以使用elements 函数检索所有剩余的值。

【讨论】:

  • @TanviMirza 谢谢你告诉我!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2018-08-03
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 2016-09-15
  • 2021-12-02
相关资源
最近更新 更多