我的问题与发布的问题here
略有不同所以我想打开一个新线程。我有一个带有5个属性的pandas数据框。其中一个属性是使用pandas series创建的。这是创建数据框的示例代码
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的值,例如在运行之后,我的id将用于组1 2540956,7138932
。我也试过上面链接中提到的代码。但是对于第一行
counts = mydf1.groupby('id').cumcount()
我收到了错误消息 TypeError:'Series'对象是可变的,因此它们不能被散列 在我的Python 3.X.你能建议我怎么解决这个问题吗?
答案 0 :(得分:0)
这应该有效。我们使用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
函数检索剩余的所有值。