考虑这个数据帧:
df = pd.DataFrame({'A': [1, 1, 2, 2, 3, 3],
'B': [10, 15, 20, 25, 30,35],
'C': [100, 150, 200, 250, 300, 350]},)
A B C
1 10 100
1 15 150
2 20 200
2 25 250
3 30 300
3 35 350
我用它来获取每组第一行的C列值:
firsts = df.groupby('A').first()['C']
首先是:(100, 200, 300)
。
现在我想添加一个新列,如果row的列C的值在firsts
中,那么它将是“1”,否则它将是“0”。
A B C D
1 10 100 1
1 15 150 0
2 20 200 1
2 25 250 0
3 30 300 1
3 35 350 0
我用这个:
df['D'] = df['C'].apply(lambda x: 1 if x in firsts else 0)
但结果是:
A B C D
1 10 100 0
1 15 150 0
2 20 200 0
2 25 250 0
3 30 300 0
3 35 350 0
如果有人能解释为什么我的解决方案是错误的,以及这个问题的实际解决方案是什么,我将不胜感激。
也可以使用
.transform('first')
一步完成:说明:
GroupBy.transform('func')
返回一个与应用的原始DF长度相同的向量func
您可以使用
isin
方法:您的方法失败的原因是python
in
运算符检查序列的索引而不是值,这与字典的工作方式相同:修改方法如下:
TL;博士:
另一个一步的方法是使用^{} 和^{} 。
我们使用^{} 中的返回作为^{} 中的条件来返回
1
当True
时0
当False
时并将它们分配给同一数据帧中的新列
df['D']
。注意:
np.where
允许使用bitwise运算符和替换用例的更复杂条件,即False
上的“旁路”相关问题 更多 >
编程相关推荐