Панды, соединяющие строки в столбце в соответствии с последовательными значениями в другом - PullRequest
3 голосов
/ 29 сентября 2019

У меня есть два столбца в DataFrame col1 и col2, и мне нужно создать столбец результатов.Каждый FD имеет несколько коррелированных MS, которые должны быть заполнены в столбце результатов, как показано на рисунке

enter image description here

dict_obj = {'col1': ['FD', 'MS', 'MS', 'FD', 'MS', 'MS', 'MS', 'FD', 'MS', 'MS'], 
            'col2': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']}
df = pd.DataFrame(dict_obj)

Ответы [ 2 ]

3 голосов
/ 29 сентября 2019

Вы можете использовать GroupBy.agg, объединить свои строки и назначить их обратно в строки "FD":

grp = (df.assign(col3=(df['col1'] == 'FD').cumsum())
         .query("col1 == 'MS'")
         .groupby('col3')['col2'].agg('|'.join))
df.loc[df['col1'] == 'FD', 'result'] = grp.values # grp.to_numpy(); pandas >= 0.24

df
  col1 col2 result
0   FD    A    B|C
1   MS    B    NaN
2   MS    C    NaN
3   FD    D  E|F|G
4   MS    E    NaN
5   MS    F    NaN
6   MS    G    NaN
7   FD    H    I|J
8   MS    I    NaN
9   MS    J    NaN
1 голос
/ 29 сентября 2019
  • use (df ["col1"] == "FD"). Cumsum () для группировки строк по количеству "FD"
  • для всех значений объединения группы col2, кроме 1-го
  • присваивать значения столбцу «result» строки с «FD» в столбце col1
df["result"] = ""
df.loc[df["col1"]=="FD", "result"] = df.groupby((df["col1"]=="FD").cumsum()) \
.apply(lambda group: group["col2"][1:].str.cat(sep="|")).values

df
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...