【问题标题】:Groupby Rowwise in Pandas熊猫中的 Groupby Rowwise
【发布时间】:2017-09-08 02:31:14
【问题描述】:

我有一个如下的DataFrame:

df=pd.DataFrame({'variable':["A","A","B","B","C","D","E","E","E","F","F","G"],'weight':[2,2,0,0,1,3,5,5,5,0,0,4]})


Out[129]: 
   variable  weight
0         A       2
1         A       2
2         B       0
3         B       0
4         C       1
5         D       3
6         E       5
7         E       5
8         E       5
9         F       0
10        F       0
11        G       4

我想根据variable 的组创建新列,新列的值基于weight 列和本身

在 R 中:我可以轻松地使用来自 dplyrrowwise 来获得所需的输出

library(dplyr)
test <-
  data.frame(
    variable    = c("A","A","B","B","C","D","E","E","E","F","F","G"), 
    weight      = c(2,2,0,0,1,3,5,5,5,0,0,4)
  )

test%>%group_by(variable)%>%rowwise()%>%mutate(Var=ifelse (weight==2,1,ifelse(.Last.value ==1|weight>1,0,NA)))

预期输出如下:

   variable weight   Var
     <fctr>  <dbl> <dbl>
 1        A      2     1
 2        A      2     1
 3        B      0    NA
 4        B      0    NA
 5        C      1    NA
 6        D      3     0
 7        E      5     0
 8        E      5     0
 9        E      5     0
10        F      0    NA
11        F      0    NA
12        G      4     0

如何在 Python 中实现这一点?

编辑:上面的 R 方法也是错误的

我的方法:

l1=[]
for i in df.variable.unique():
    temp=df.loc[df.variable==i]
    l2 = []
    for j in range(len(temp)):
        print(i,j)

        if temp.iloc[j,1]<=2 :
            l2.append(1)
        elif temp.iloc[j,1]>2 and j==0:
            l2.append('ERROR')
        elif temp.iloc[j,1]>2 and j > 0 :
            if l2[j - 1] == 1:
                l2.append(1)
            else:
                l2.append(0)
        print(l2)
    l1.extend(l2)
df['NEW']=l1

数据输入

df=pd.DataFrame({'variable':["A","A","B","B","C","D","E","E","E","F","F","G"],'weight':[2,2,0,0,1,3,3,5,5,0,0,4]})

输出

df['NEW']=l1
df
Out[232]: 
   variable  weight    NEW
0         A       2      1
1         A       2      1
2         B       0      1
3         B       0      1
4         C       1      1
5         D       3  ERROR
6         E       3  ERROR
7         E       5      0
8         E       5      0
9         F       0      1
10        F       0      1
11        G       4  ERROR

【问题讨论】:

  • 我看不到groupby 的作用。 df.assign(Var=df.weight.eq(2).mul(1).mask(df.weight.le(1)))
  • 我无法理解组合背后的逻辑......你能解释一下吗?
  • @cᴏʟᴅsᴘᴇᴇᴅ 将打开一个新问题
  • @cᴏʟᴅsᴘᴇᴇᴅ 抱歉,我进行了更新,并且已经接受了 Pir 的回答,感谢你们的时间!!

标签: python pandas


【解决方案1】:

没有 Groupby!
如果我的解释正确,请告诉我。


选项 1

df.assign(Var=df.weight.eq(2).mul(1).mask(df.weight.le(1))) 

   variable  weight  Var
0         A       2  1.0
1         A       2  1.0
2         B       0  NaN
3         B       0  NaN
4         C       1  NaN
5         D       3  0.0
6         E       5  0.0
7         E       5  0.0
8         E       5  0.0
9         F       0  NaN
10        F       0  NaN
11        G       4  0.0

选项 2

df.assign(Var=np.array([np.nan, 1, 0])[np.searchsorted([1, 2], df.weight.values)])

   variable  weight  Var
0         A       2  1.0
1         A       2  1.0
2         B       0  NaN
3         B       0  NaN
4         C       1  NaN
5         D       3  0.0
6         E       5  0.0
7         E       5  0.0
8         E       5  0.0
9         F       0  NaN
10        F       0  NaN
11        G       4  0.0

选项 3

df.assign(Var=np.array([1, 0, np.nan])[np.sign(df.weight.values - 2)])

   variable  weight  Var
0         A       2  1.0
1         A       2  1.0
2         B       0  NaN
3         B       0  NaN
4         C       1  NaN
5         D       3  0.0
6         E       5  0.0
7         E       5  0.0
8         E       5  0.0
9         F       0  NaN
10        F       0  NaN
11        G       4  0.0

【讨论】:

  • 这是我的错,我的样本数据无法区分。
  • 别担心,当我看到新数据并理解问题时,我会更新我的答案。
  • 让我打开一个新问题~对不起,因为你的回答完全解决了输出
  • 我做了更新,准确地说,我是被我的一位同事问的……感觉卡了一晚上……
猜你喜欢
  • 2019-02-24
  • 1970-01-01
  • 2022-07-05
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多