pandas groupby () с настраиваемой агрегатной функцией для объединения столбцов, а затем строк с использованием pandas - PullRequest
3 голосов
/ 16 июня 2020

Предположим, у меня есть фрейм данных, например:

 Column1    Column2    Column3    Column4
 1          I          am         abc
 3          on         weekend    holidays
 1          I          do         business
 2          I          am         xyz
 3          I          do         nothing
 2          I          do         job

после применения groupby () с использованием pandas ожидаемый результат:

Column1    Column2
1          I am abc I do business
2          I am Xyz I do job
3          On weekend holidays I do nothing

Требуемая агрегация применяется сначала для столбец, чем по строкам.

Как это можно сделать?

Ответы [ 5 ]

2 голосов
/ 16 июня 2020

Используйте DataFrame.set_index с DataFrame.stack сначала, а затем объедините join в GroupBy.agg:

df1 = (df.set_index('Column1')
         .stack()
         .groupby("Column1")
         .agg(' '.join)
         .reset_index(name='Column2'))
print (df1)
   Column1                           Column2
0        1            I am abc I do business
1        2                 I am xyz I do job
2        3  on weekend holidays I do nothing
2 голосов
/ 16 июня 2020

Вы пробовали:

df['newcol'] = df.apply(lambda x: " ".join(x[1:]), axis=1)
df.groupby('Column1').agg({'newcol': lambda x: " ".join()})
1 голос
/ 16 июня 2020

Вы можете воспользоваться тем фактом, что последние три столбца имеют строковый тип, и объединить их, используя функцию sum и groupby для column1, на этот раз агрегируя с python s соединение строки функция:

outcome = (df
           .set_index("Column1")
           #this helps to put space between
           #the columns when summed
           .add(' ')
           #this combines the columns into one
           .sum(axis=1)
           .str.rstrip(" ")
           .groupby("Column1")
           .agg(" ".join)
           .reset_index(name='Column2')
          )

outcome

    Column1      Column2
0   1           I am abc I do business
1   2           I am xyz I do job
2   3           on weekend holidays I do nothing
1 голос
/ 16 июня 2020

Можете ли вы попробовать следующее

def apply_union(x):
    ## join multiple columns to single sting in row
    x = x.apply(lambda row: ' '.join(row.values.astype(str)), axis=1)
    ## concat rows to single string
    x = x.str.cat(sep=" ")
    return x
df.groupby("Column1")[["Column2","Column3","Column4"]].apply(lambda x: apply_union(x))
1 голос
/ 16 июня 2020

Можешь попробовать это? Сначала объедините слова нужных столбцов в новый столбец, затем используйте groupby, чтобы объединить их вместе.

df['new_col'] = df['Column2'] + str(" ") + df['Column3'] + str(" ") + df['Column4']

df.groupby('Column1')['new_col'].agg(lambda x: ' '.join(x.astype(str)))

Column1
1              I am abc I do business
2                   I am xyz I do job
3    on weekend holidays I do nothing
Name: new_col, dtype: object
...