我想根据每一行的现有列获取新列的 bool 值,示例 dataframe
是,
key doc_no_list amount date doc_no
a1 [1,2] 1.0 2017-10-01 1
a2 [2,1] 1.0 2017-10-01 2
a3 [3] 2.0 2017-10-02 3
a4 [4,5] 3.0 2017-10-03 4
a5 [5,4] 3.0 2017-10-04 5
a6 [2,6] 4.0 2017-10-05 2
a7 [6,2] 4.0 2017-10-05 6
对于键为
a1
和 a2
的行,它们的 doc_no
(不是唯一的)被放在一个列表 [1,2]
或 [2,1]
(这个列表一直保持唯一,即没有重复的 doc_no
),因为它们具有相同的 amount
值。现在,对于大小 > 1 的
doc_no_list
值,我想检查每个 doc_no
中与每个 doc_no_list
对应的行是否具有相同的 date
和 amount
值,如果有,将 True
放在新列 same_date
中。所以结果 dataframe
应该是这样的,key doc_no_list amount date doc_no same_date
a1 [1,2] 1.0 2017-10-01 1 True
a2 [2,1] 1.0 2017-10-01 2 True
a3 [3] 2.0 2017-10-02 3 nan
a4 [4,5] 3.0 2017-10-03 4 False
a5 [5,4] 3.0 2017-10-04 5 False
a6 [2,6] 4.0 2017-10-05 2 True
a7 [6,2] 4.0 2017-10-05 6 True
我想知道什么是最好的方法来做到这一点。
最佳答案
与其拥有一个包含列表的列,我更希望拥有该“文档组”的 id:
In [11]: df["doc_group"] = df.doc_no_list.apply(lambda ls: hash(tuple(sorted(ls))))
In [12]: df
Out[12]:
key doc_no_list amount date doc_no doc_group
0 a1 [1, 2] 1.0 2017-10-01 1 3713081631934410656
1 a2 [2, 1] 1.0 2017-10-01 2 3713081631934410656
2 a3 [3] 2.0 2017-10-02 3 3430021387564
3 a4 [4, 5] 3.0 2017-10-03 4 3713084879518070856
4 a5 [5, 4] 3.0 2017-10-04 5 3713084879518070856
5 a6 [2, 6] 4.0 2017-10-05 2 3713082714458328131
6 a7 [6, 2] 4.0 2017-10-05 6 3713082714458328131
注意:您可能可以在没有 hash.tuple.sorted 的情况下执行此操作,例如如果你有自己的id!
现在您可以使用 groupby 的机制:
In [13]: df.groupby("doc_group")["date"].transform(lambda x: len(x.unique()) == 1)
Out[13]:
0 True
1 True
2 True
3 False
4 False
5 True
6 True
Name: date, dtype: bool
In [14]: df["same_date"] = df.groupby("doc_group")["date"].transform(lambda x: len(x.unique()) == 1)
关于python - Pandas 根据每行的现有列获取新列的 bool 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47020074/