python - Pandas 根据每行的现有列获取新列的 bool 值

标签 python python-3.x pandas dataframe

我想根据每一行的现有列获取新列的 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),因为它们具有相同的数量 值。

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

相关文章:

python - 试图从文本文件中提取有用的信息 block

python - 在 while 循环中使用 "AND"而不是 "OR"

python - 如何从嵌入的字典/列表中提取所有值?

python - 使用类似维度转换行值

python - 将列中的任意字符串替换为 1

python - 尝试遍历多个文本文件并将第 2 行附加到列表

python - 如何在不阻塞事件循环的情况下迭代一个大列表

r - 模块 'rpy2.robjects.pandas2ri' 没有属性 'ri2py'

python - 字典值的惰性评估?

python - 在数据帧上使用 pandas 的重新索引方法时,为什么原始值会丢失?