Применение значений к столбцу и группирование всех столбцов по этим значениям - PullRequest
0 голосов
/ 08 мая 2018

У меня есть кадр данных панд, как показано здесь. Все строки без значения для ["sente"] содержат дополнительную информацию, но они еще не связаны с ["sente"].

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"].

  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)

, но он работает только для одной дополнительной строки, а не для двух или более.

Это группирует один столбец так, как я хочу:

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

Но для большего количества столбцов это не работает так, как я хочу:

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

Есть ли способ сделать это без использования стековых функций?

1 Ответ

0 голосов
/ 08 мая 2018

Использование:

#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

Последняя замена NaN s путем прямого заполнения ffill и join удалением NaN s dropna:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...