如果组中的任何一行包含某个值,则创建一个新列并分配值

Mia21

我正在尝试根据以下方法为组中的每个组分配新列的值:如果组中的任何行包含特定值,则该组的新列值应为某个值。

到目前为止,我已经尝试使用np.where和pandas dataframe any()并将其应用于group by。这适用于非常小的数据集。我的原始数据集包含约180万条记录,而我尝试的方法太慢了,它从未在原始数据集上运行完毕。所以想知道是否有一种有效的方法来实现这一目标。

例如,如果我有一个带有A,B和C列的数据框

     A      B   C
0   alpha   m   t
1   beta    n   r
2   cosine  q   f
3   alpha   m   t
4   beta    m   t
5   alpha   n   r
6   cosine  q   f

对于B和C组,创建一个新列'D',其值基于'A'。在一个组中,如果A列的任一行具有beta,则该组的“ D”列(D的所有行)应为beta。如果组中的所有行均不包含beta,则下一个层次结构为余弦,即,如果该组中列A的任何行均具有余弦,则该组中列D的所有行均应为余弦。

到目前为止,我尝试过的方法:

def test(dft):
    dft['D']=np.where(dft[dft['A']=='beta'].any(),'beta',np.where(dft[dft['A']=='cosine'].any(),'cosine',np.where(dft[dft['A']=='alpha'].any(),'alpha',dft['A'])))
    return dft['D']
dft2=dft.groupby(['B','C']).apply(test)
dft2=dft2.reset_index()

我得到的结果是:

    B   C   level_2    D
0   m   t   0         beta
1   m   t   3         beta
2   m   t   4         beta
3   n   r   1         beta
4   n   r   5         beta
5   q   f   2         cosine
6   q   f   6         cosine

预期结果应如下所示:

     A      B   C          D
0   alpha   m   t        beta
1   beta    n   r        beta
2   cosine  q   f        cosine
3   alpha   m   t        beta
4   beta    m   t        beta
5   alpha   n   r        beta
6   cosine  q   f        cosine
BEN_YO

IIUC使用Categorical转换您的列A,然后执行groupby transform

df.A=pd.Categorical(df.A,categories=['alpha','cosine','beta'],ordered=True)
df.groupby(['B','C']).A.transform('max')
Out[1200]: 
0      beta
1      beta
2    cosine
3      beta
4      beta
5      beta
6    cosine
Name: A, dtype: object
df['D']=df.groupby(['B','C']).A.transform('max')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R:如果前一行包含某个值,则更新行

如果该列中有任何列包含某个值,则在Pandas Dataframe中删除一行

为一行中的每个值创建一个新列

创建新列,按组包含另一列的最后一个值

如何使用一行中所有括号内包含的值创建一个新列?

如果时间频率大于某个值,则创建一个新列

如果另一列中的某个值是离群值,如何在R中创建一个新的列,该列为1?

如果条件为真,则在 Pandas 中创建一个新列并从现有列中分配值

如何为 sas 中的每一行分组 50 列并为其值创建一个新列?

熊猫:如果预先存在的列包含一些值,则使用“是”创建一个新列;如果该列的值为“”,则创建一个“否”

根据上一行的值创建一个新列并删除当前行

使用每一行的非空值创建一个新列

如果单元格包含某个文本,则为其分配一个值

创建新列以将与另一列中的另一个重复值相对应的值排列在一行中

如果某列包含某个值,如何检查大型csv的每一行并写入该行?

如果一行包含一个单词,则返回字符之间的文本“

R:如果整个组中的一个值低于某个阈值,则为整个组创建一个0或1的标志

R:如果行包含某个值(对于许多列),如何从数据框中删除行

创建一个新的Excel列,并使用PANDAS在列的每一行中重复出现一个值的次数

创建一个新列,该列列出值大于某个特定值的列的名称

为一行中是否包含任何列中的字符串创建一个逻辑列

如果列中包含单词,则使用找到的值生成一个新列

删除一行,如果它包含熊猫中的某个值

将多个值合并到一个新列中的一行 Pandas Python

如果任何行包含 R 中的特定值,则保留列

创建一个mySQL视图,其中每一行是同一行中特定列的值

如果至少一行包含值,则Power BI计数

如果某列不包含同一行中另一列的值,则将新列pandas中另一列的值添加

Pandas - 创建新列 - 如果另一个列值在列表中(正确方式)