Столбцы GroupBy на префиксе заголовка столбца - PullRequest
0 голосов
/ 16 января 2019

У меня есть фрейм данных с именами столбцов, которые начинаются с заданного списка префиксов. Я хочу получить сумму значений в кадре данных, сгруппированных по столбцам, которые начинаются с того же префикса.

df = pd.DataFrame([[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]],
              columns=['abc', 'abd', 'wxy', 'wxz'])
prefixes = ['ab','wx']
df
    abc abd wxy wxz
0   1   2   3   4
1   1   2   3   4
2   1   2   3   4
3   1   2   3   4

Единственный способ выяснить, как это сделать, - циклически перебрать список префиксов, получить столбцы из кадра данных, которые начинаются с этой строки, и затем суммировать результаты.

results = []
for p in prefixes:
  results.append([p, df.loc[:, df.columns.str.startswith(p)].values.sum()])
results = pd.DataFrame(results,)
results.set_index(keys=[0], drop=True).T

    ab  wx
1   12  28

Я надеялся, что есть более элегантный способ сделать это, возможно, с помощью groupby (), но я не мог понять это.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Во-первых, необходимо определить, какие столбцы содержат какой префикс. Затем мы используем это для выполнения groupby.

grouper = [next(p for p in prefixes if p in c) for c in df.columns]
u = df.groupby(grouper, axis=1).sum()

   ab  wx
0   3   7
1   3   7
2   3   7
3   3   7

Почти там, сейчас,

u.sum().to_frame().T

   ab  wx
0  12  28

Другая опция использует np.char.startswith и argmax для векторизации:

idx = np.char.startswith(
    df.columns.values[:, None].astype(str), prefixes).argmax(1)

(pd.Series(df.groupby(idx, axis=1).sum().sum().values, index=prefixes)
   .to_frame()
   .transpose())

   ab  wx
0  12  28
0 голосов
/ 16 января 2019

Использование groupby после нарезки столбцов

df.groupby(df.columns.str[:-1],axis=1).sum().sum().to_frame().T
Out[317]: 
   ab  wx
0  12  28

Обновление

l=sum([[x]*df.columns.str.startswith(x).sum() for x in prefixes],[])
df.groupby(l,axis=1).sum().sum().to_frame().T
Out[329]: 
   ab  wx
0  12  28
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...