使用Pandas的groupby时,检查特定列的值。

huangapple go评论91阅读模式
英文:

Check certain columns' values when using groupby in Pandas

问题

我有一个类似这样的数据框:

df = pd.DataFrame({'Name': ['Bob', 'Bob', 'Bob', 'Joe', 'Joe', 'Joe'],
                   'ID': [1, 2, 3, 4, 5, 6],
                   'Value': [1, 1, 1, 0, 0, 1]})
df

目标是计算一个名为 result 的列。这是通过检查name列中的每个分组来完成的,即Bob和Joe。

因此,对于每个分组,如果value列中的值都是1,那么该分组的result列值将全部为1。如果值全为0,那么该分组的result列值将全部为0。如果值是1和0的混合,则该分组的result列值将全部为0。

因此,输出应如下所示:

Name    ID    Value    Result
 Bob     1       1       1
 Bob     2       1       1
 Bob     3       1       1
 Joe     4       0       0
 Joe     5       0       0
 Joe     6       1       0

难点在于创建这些分组,然后检查每个分组。

我的尝试:

df = df.groupby('Name')
df['Result'] = df.apply(lambda x: x['Value'])
英文:

I have a dataframe like this

df = pd.DataFrame({'Name': ['Bob', 'Bob', 'Bob', 'Joe', 'Joe', 'Joe'],
                'ID': [1,2,3,4,5,6],
                'Value': [1,1,1,0,0,1]})
df

 Name    ID    Value   
 Bob     1       1          
 Bob     2       1          
 Bob     3       1          
 Joe     4       0          
 Joe     5       0          
 Joe     6       1          

The goal is to compute a result column. This is done by checking each group in the name column, in this case Bob & Joe.

So for each group, if the values in the value column are all 1, the values in the result column for that group will be all 1. If the values are all 0, the result column values for that group will be all 0. And if the values are a mix of 1 and 0, the result column for that group will be all 0.

So the output should look like this:

Name    ID    Value    Result
 Bob     1       1       1   
 Bob     2       1       1   
 Bob     3       1       1   
 Joe     4       0       0   
 Joe     5       0       0   
 Joe     6       1       0   

The difficulty is creating these groups and then checking each one.

My attempt:

df = df.groupby('Name')

df['Result'] = df.apply(lambda x: x['Value'])

答案1

得分: 4

使用groupby+transformall

df['Result'] = df.groupby('Name')['Value'].transform('all').astype(int)
# 或者 df['Result'] = df['Value'].eq(1).groupby(df['Name']).transform('all').astype(int)
print(df)

      Name  ID  Value  Result
    0  Bob   1      1       1
    1  Bob   2      1       1
    2  Bob   3      1       1
    3  Joe   4      0       0
    4  Joe   5      0       0
    5  Joe   6      1       0
英文:

Use all with groupby+transform:

df['Result'] = df.groupby('Name')['Value'].transform('all').astype(int)
# or df['Result'] = df['Value'].eq(1).groupby(df['Name']).transform('all').astype(int)
print(df)

  Name  ID  Value  Result
0  Bob   1      1       1
1  Bob   2      1       1
2  Bob   3      1       1
3  Joe   4      0       0
4  Joe   5      0       0
5  Joe   6      1       0

答案2

得分: 2

df['Result']=df.groupby('Name').Value.all().reindex(df.Name).astype(int).values
df
Out[57]:
Name ID Value Result
0 Bob 1 1 1
1 Bob 2 1 1
2 Bob 3 1 1
3 Joe 4 0 0
4 Joe 5 0 0
5 Joe 6 1 0

英文:

IIUC

df['Result']=df.groupby('Name').Value.all().reindex(df.Name).astype(int).values
df
Out[57]: 
  Name  ID  Value  Result
0  Bob   1      1       1
1  Bob   2      1       1
2  Bob   3      1       1
3  Joe   4      0       0
4  Joe   5      0       0
5  Joe   6      1       0

huangapple
  • 本文由 发表于 2020年1月3日 23:33:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/59581258.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定