首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将值应用于列并按这些值对所有列进行分组

将值应用于列并按这些值对所有列进行分组
EN

Stack Overflow用户
提问于 2018-05-08 08:00:56
回答 1查看 38关注 0票数 1

如图所示,我有一只熊猫。所有没有["sente"]值的行都包含更多信息,但它们尚未链接到["sente"]

代码语言:javascript
复制
id    pos      value       sente
1     a         I           21
2     b         have        21
3     b         a           21
4     a         cat         21
5     d         !           21
6     cat       N           Nan
7     a         My          22
8     a         cat         22
9     b         is          22
10    a         cute        22
11    d         .           22
12    cat       N           NaN
13    cute      M           NaN

现在,我希望在["sente"]中没有值的每一行都能从上面的行中获得它的值。然后,我想按照["sente"]对它们进行分组,并从行中创建一个新列,其中的内容不包含在["sente"]中的值。

代码语言:javascript
复制
  sente      pos          value            content
   21     a,b,b,a,d   I have a cat !     'cat,N'
   22     a,a,b,a,d   My cat is cute .   'cat,N','cute,M'

这是我的第一步:

df.loc[(df['sente'] != df["sente"].shift(-1) & df["sente"] == Nan) , "sente"] = df["sente"].shift(+1)

但是它只适用于一个额外的行,而不是当有2个或更多的行时。

这个列按我想要的方式分组:

df.groupby(["sente"])['value'].apply(lambda x: " ".join()

但是对于更多的专栏,它不像我想要的那样工作:

df.groupby(["sente"]).agr(lambda x: ",".join()

在不使用堆栈函数的情况下,有办法做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-08 08:26:22

使用:

代码语言:javascript
复制
#check NaNs values to boolean mask
m = df['sente'].isnull()
#new column of joined columns only if mask
df['contant'] = np.where(m, df['pos'] + ',' + df['value'], np.nan)
#replace to NaNs by mask
df[['pos', 'value']] = df[['pos', 'value']].mask(m)
print (df)
    id  pos value  sente contant
0    1    a     I   21.0     NaN
1    2    b  have   21.0     NaN
2    3    b     a   21.0     NaN
3    4    a   cat   21.0     NaN
4    5    d     !   21.0     NaN
5    6  NaN   NaN    NaN   cat,N
6    7    a    My   22.0     NaN
7    8    a   cat   22.0     NaN
8    9    b    is   22.0     NaN
9   10    a  cute   22.0     NaN
10  11    d     .   22.0     NaN
11  12  NaN   NaN    NaN   cat,N
12  13  NaN   NaN    NaN  cute,M

最后,将NaNs替换为ffill前向填充,join替换为dropna删除NaNs。

代码语言:javascript
复制
df1 = df.groupby(df["sente"].ffill()).agg(lambda x: " ".join(x.dropna()))
print (df1)
             pos             value       contant
sente                                           
21.0   a b b a d    I have a cat !         cat,N
22.0   a a b a d  My cat is cute .  cat,N cute,M
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50228776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档