Группировка и объединение строк для фрейма данных

#pandas

Вопрос:

Вопрос

Учитывая, что groupedMarket = df.groupby("Market")

Как создать новый столбец Related_Markets со строками, объединенными "Ticker" "-" "Time" "-" "Signal" для других членов groupedMarket .

Пример Кода

 import pandas as pd
import numpy as np
dat = [["Bull_Flag","EURUSD","W","FX"],["Bull_Candle","GBPUSD","D","FX"],["Bull_Volume","UK100","H1","Index"],["Bear_Volume","USDCHF","W","FX"]]
df = pd.DataFrame(dat,columns=['Signal', 'Ticker', 'Time', 'Market'])
 

Фрейм данных

     Signal     Ticker      Time        Market
0   Bull_Flag   EURUSD     W            FX
1   Bull_Candle GBPUSD     D            FX
2   Bull_Volume UK100      H1           Index
3   Bear_Volume USDCHF     W            FX
 

Желаемый Результат

     Signal     Ticker      Time         Market  Related_Markets
0   Bull_Flag   EURUSD     W            FX      GBPUSD-D-Bull_Candle USDCHF-W-Bear_Volume
1   Bull_Candle GBPUSD     D            FX      EURUSD-W-Bull_Flag, USDCHF-W-Bear_Volume
2   Bull_Volume UK100      H1           Index   
3   Bear_Volume USDCHF     W            FX      EURUSD-W-Bull_Flag GBPUSD-D-Bull_Candle
 

Если другого члена группы не существует, это может быть либо пустая строка "" , либо NaN .

Комментарии:

1. или другие участники groupedMarket — есть ли здесь выбор или это просто случайное исключение текущей строки?

2. Он говорит, что для меня случайен, исключая текущую строку , но есть причина, по которой я хотел бы уточнить. Надеюсь, вы понимаете. Также ИМО , лучше изложить это в тексте вопроса..!! ( поскольку комментарии являются временными )

3. Все остальные члены группы, за исключением текущей строки IIUC, в соответствии с желаемым результатом. Спасибо

Ответ №1:

Вот решение с использованием наборов python и apply :

 df['key'] = df[['Ticker', 'Granularity', "Signal"]].apply('-'.join, axis=1)
markets = df.groupby('Market')['key'].apply(set)
df['related-markets'] = df.apply(lambda s: ', '.join(markets[s['Market']].difference([s['key']])), axis=1)
df.drop('key', axis=1)
 

выход:

         Signal  Ticker Granularity Market                             related-markets
0    Bull_Flag  EURUSD           W     FX  GBPUSD-D-Bull_Candle, USDCHF-W-Bear_Volume
1  Bull_Candle  GBPUSD           D     FX    EURUSD-W-Bull_Flag, USDCHF-W-Bear_Volume
2  Bull_Volume   UK100          H1  Index                                            
3  Bear_Volume  USDCHF           W     FX    EURUSD-W-Bull_Flag, GBPUSD-D-Bull_Candle
 

ПРИМЕЧАНИЕ. в вашем вопросе были несоответствия, такие как время/детализация, надеюсь, вы легко адаптируетесь