Python 使用3个现有列上的条件在dataframe中添加列
我有一个现有的Pandas数据帧,我想根据以下模式对其进行操作: 现有表在“代码”列中有不同的代码集。每个“代码”都在“标签”列中列出了某些标签。每个标签都已标记为0或1 根据以下条件,我需要为每组“代码”添加一个值为0或1的“新_列”: 仅当某一特定“代码”的所有“标签”均已删除时,才在“新_列”中填写1 在“标记”列中的值等于1。注:我需要为属于该特定“代码”的所有行填写1 如所需表格所示,只有code=30的“标签”列中的所有“标签”设置为1。因此,对于特定代码,我将“new_column”设置为1。其余代码已设置为0值 现有表格: 所需表格Python 使用3个现有列上的条件在dataframe中添加列,python,pandas,Python,Pandas,我有一个现有的Pandas数据帧,我想根据以下模式对其进行操作: 现有表在“代码”列中有不同的代码集。每个“代码”都在“标签”列中列出了某些标签。每个标签都已标记为0或1 根据以下条件,我需要为每组“代码”添加一个值为0或1的“新_列”: 仅当某一特定“代码”的所有“标签”均已删除时,才在“新_列”中填写1 在“标记”列中的值等于1。注:我需要为属于该特定“代码”的所有行填写1 如所需表格所示,只有code=30的“标签”列中的所有“标签”设置为1。因此,对于特定代码,我将“new_column
我还没有尝试过任何解决方案,因为这似乎超出了我目前的专业水平。我认为这个问题的正确答案是@user3483203在评论中给出的:
df['new_column']=df.groupby('code')['tag'].transform(all).astype(int)
该方法应用于数据帧,无论传递给它的是什么,保持轴长度不变
文档中的简单示例清楚地解释了该用法
关于这个问题,运行此代码段时会发生以下情况:
- 首先执行与“代码”相关的分组。最终将得到一个
对象李>DataFrameGroupBy
- 接下来,从中选择
列,以标记
对象结束李>SeriesGroupBy
- 对于该分组,您可以通过
应用transform
函数,最终将布尔值键入all
李>int
- 基本上,您可以这样理解它(值是二进制的,以便与您的答案更相关):
>>int(所有([1,1,1,1]))
1.
>>>int(所有([1,0,1,1]))
0
最后,您将刚刚创建的列分配给列
new\u column
给旧数据帧。用户3483203的初始答案有效。这是一个变体。但他的方式更简洁
df.groupby('code')['tag'].transform(all).astype(int)
感谢您的及时回复,但我看不到在您的code@M.Mufti,我可以验证user3483203代码是否正在处理您给定的测试数据,并且我相信它是基于此问题中提到的逻辑的正确代码。我支持@ScottBoston's Comments Third@ScottBoston's commentHi,我没有理由不同意此解决方案,但我仍在努力获得所需的结果。新的_列显示所有零。是否有人可以提供建议。找到了未获得所需结果的原因,但它为我的原始查询添加了另一个问题。还有一列名为“category”,还有一列名为“category”,有3个值,例如1、2和3。“类别”1中“代码”的“标记”不一定相同,因为“代码”30的转换(全部)返回False。我认为最好为更改的场景发布新的查询,但是我通过接受答案来结束当前查询。我不认为我完全理解新的场景。正如你自己建议的那样,你可以提出一个新问题(前提是这个问题还不存在)。谢谢
code label tag
0 10 AAA 0
1 10 BBB 1
2 10 CCC 0
3 10 DDD 0
4 10 EEE 0
5 20 AAA 1
6 20 CCC 0
7 20 DDD 1
8 30 BBB 1
9 30 CCC 1
10 30 EEE 1
code label tag new_column
0 10 AAA 0 0
1 10 BBB 1 0
2 10 CCC 0 0
3 10 DDD 0 0
4 10 EEE 0 0
5 20 AAA 1 0
6 20 CCC 0 0
7 20 DDD 1 0
8 30 BBB 1 1
9 30 CCC 1 1
10 30 EEE 1 1