我想根据每一行的现有列获取新列的 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

对于键为 a1a2 的行,它们的 doc_no (不是唯一的)被放在一个列表 [1,2][2,1] (这个列表一直保持唯一,即没有重复的 doc_no ),因为它们具有相同的 amount 值。

现在,对于大小 > 1 的 doc_no_list 值,我想检查每个 doc_no 中与每个 doc_no_list 对应的行是否具有相同的 dateamount 值,如果有,将 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/

10-12 20:30