Pandas python中多列上的数据帧条件

Pandas python中多列上的数据帧条件,pandas,list,dataframe,python-3.6,Pandas,List,Dataframe,Python 3.6,数据帧: i_id sg_yes_or_no i-123 yes i-123 yes i-456 no i-678 yes i-1y6 yes i-1y6 yes 预期产出应为: i_id sg_yes_or_no sg_only_one sg_morethan_one i-123 yes yes i-123 yes yes i-456 no

数据帧:

i_id    sg_yes_or_no
i-123   yes
i-123   yes
i-456   no
i-678   yes
i-1y6   yes
i-1y6   yes
预期产出应为:

i_id    sg_yes_or_no    sg_only_one sg_morethan_one
i-123   yes                         yes
i-123   yes                         yes
i-456   no      
i-678   yes             yes 
i-1y6   yes                         yes
i-1y6   yes                         yes

尝试使用以下语法,但无效:

for df['sg_yes_or_no'] in 'yes':
    if df['i_id'].nunique() == 1:
        df['sg_only_one'] = 'yes'
    elif df['i_id'].nunique() >= 1:
        df['sg_morethan_one'] = 'yes'
如果第二列为“是”,则考虑新的_数据帧,并检查(计数)新_数据帧中的第一列值。如果计数为1,则在第3列中写入“是”(或用“一个sg”更新第2列),如果计数大于1,则在第4列中写入“是”(或用“更多sg”更新第2列)

请协助

一个优雅的解决方案,包括:


我们还可以使用:

m1 = df.groupby('i_id')['i_id'].transform('size').gt(1)
m2 = df['sg_yes_or_no'].ne('no')
df['sg_morethan_one'] = df['sg_yes_or_no'].where(m & m2)
df['sg_only_one'] = df['sg_yes_or_no'].where(~m & m2)
当只有两个类别时,这可能更有效,但是对于n个类别,
pivot\u table
选项更好,此外,
pivot\u table
避免应用n次
序列。其中

编辑

new_df = df.join(df.pivot_table(columns = (df.groupby('i_id')['i_id']
                                             .transform('size')
                                             .gt(1)
                                             .astype(int)
                                             .mask(df['sg_yes_or_no'].eq('no'), 2)), 
                                values='sg_yes_or_no', 
                                index=df.index, 
                                aggfunc='first')
                  .rename(columns={0 : "one_sg",
                                   1 : "more_sg",
                                   2 : "no_sg"})
                  .sort_index(axis=1, ascending=False))
print(new_df)
    i_id sg_yes_or_no one_sg no_sg more_sg
0  i-123          yes    NaN   NaN     yes
1  i-123          yes    NaN   NaN     yes
2  i-456           no    NaN    no     NaN
3  i-678          yes    yes   NaN     NaN
4  i-1y6          yes    NaN   NaN     yes
5  i-1y6          yes    NaN   NaN     yes
优雅的解决方案,包括:


我们还可以使用:

m1 = df.groupby('i_id')['i_id'].transform('size').gt(1)
m2 = df['sg_yes_or_no'].ne('no')
df['sg_morethan_one'] = df['sg_yes_or_no'].where(m & m2)
df['sg_only_one'] = df['sg_yes_or_no'].where(~m & m2)
当只有两个类别时,这可能更有效,但是对于n个类别,
pivot\u table
选项更好,此外,
pivot\u table
避免应用n次
序列。其中

编辑

new_df = df.join(df.pivot_table(columns = (df.groupby('i_id')['i_id']
                                             .transform('size')
                                             .gt(1)
                                             .astype(int)
                                             .mask(df['sg_yes_or_no'].eq('no'), 2)), 
                                values='sg_yes_or_no', 
                                index=df.index, 
                                aggfunc='first')
                  .rename(columns={0 : "one_sg",
                                   1 : "more_sg",
                                   2 : "no_sg"})
                  .sort_index(axis=1, ascending=False))
print(new_df)
    i_id sg_yes_or_no one_sg no_sg more_sg
0  i-123          yes    NaN   NaN     yes
1  i-123          yes    NaN   NaN     yes
2  i-456           no    NaN    no     NaN
3  i-678          yes    yes   NaN     NaN
4  i-1y6          yes    NaN   NaN     yes
5  i-1y6          yes    NaN   NaN     yes

它不工作@ansev。我可以用“否”、“一个”和“更多”来更新sg_是或否吗?如果我使用此代码,我得到的第3列和第4列是空的,其中没有任何内容。此代码适用于示例数据帧(两类),我已更新了“no_sg”、“one_sg”和“more_sg”的代码,请检查编辑部分。考虑接受或投票的答案价值工作,它的工作,但我们可以更新第二栏?而不是增加三列?我编辑了我的问题,请查看第二个预期答案。
df['sg\u yes\u或\u no']=(df.groupby('I\u id')['I\u id'].transform('size').gt(1).astype(int).mask(df['sg_yes_或_no'].eq('no'),2)).map({0:'one_sg',1:'more_sg',2:'no_sg})
它不起作用@ansev。我能用“no_sg”,“one_sg”和“more_sg”更新sg_yes或_no吗?如果我使用此代码,我将得到空的第3列和第4列,其中没有任何内容。此代码适用于示例数据帧(两类),我已更新了“no_sg”、“one_sg”和“more_sg”的代码请检查或编辑段落编辑。考虑接受或投票的答案值工作,它的工作,但我们可以更新第二列?而不是添加三个额外的列?我编辑了我的问题,请参阅第二个预期答案。<代码> df [ 'sgyyeSyrOrn''] =(df.GypBy(i'IID))[ [ iIID ] ].transform('size').gt(1).astype(int).mask(df['sg_yes_或_no'].eq('no'),2)).map({0:'one_sg',1:'more_sg',2:“否”})
new_df = df.join(df.pivot_table(columns = (df.groupby('i_id')['i_id']
                                             .transform('size')
                                             .gt(1)
                                             .astype(int)
                                             .mask(df['sg_yes_or_no'].eq('no'), 2)), 
                                values='sg_yes_or_no', 
                                index=df.index, 
                                aggfunc='first')
                  .rename(columns={0 : "one_sg",
                                   1 : "more_sg",
                                   2 : "no_sg"})
                  .sort_index(axis=1, ascending=False))
print(new_df)
    i_id sg_yes_or_no one_sg no_sg more_sg
0  i-123          yes    NaN   NaN     yes
1  i-123          yes    NaN   NaN     yes
2  i-456           no    NaN    no     NaN
3  i-678          yes    yes   NaN     NaN
4  i-1y6          yes    NaN   NaN     yes
5  i-1y6          yes    NaN   NaN     yes