【发布时间】: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 中:我可以轻松地使用来自 dplyr 的 rowwise 来获得所需的输出
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 的回答,感谢你们的时间!!