Панды перебирают строки и автоматически объединяют результаты? - PullRequest
0 голосов
/ 08 июля 2019

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

MWE:

import pandas as pd
df = pd.DataFrame({'a': list(range(3)), 'b': list(range(3))})

pd.concat(df.apply(lambda row: (
    pd.DataFrame(pd.np.zeros((row.a + row.b + 1, 2)), columns=['c', 'd']).assign(**row)
), axis=1).values).reset_index(drop=True)
     c    d  a  b
0  0.0  0.0  0  0
1  0.0  0.0  1  1
2  0.0  0.0  1  1
3  0.0  0.0  1  1
4  0.0  0.0  2  2
5  0.0  0.0  2  2
6  0.0  0.0  2  2
7  0.0  0.0  2  2
8  0.0  0.0  2  2

но я чувствую, что это глупо. Я бы предположил, что есть прямой способ объединить все результаты, полученные от apply (как в R). Вещи, которые мне не нравятся:

  • добавление начальных значений с помощью **row
  • использование базового массива numpy для использования pd.concat
  • reset_index, поскольку окончательный индекс получен из нового кадра данных, созданного в цикле, а не из исходного.

1 Ответ

0 голосов
/ 08 июля 2019

Я не могу найти дубликат.Но IIUC, вы пытаетесь сделать что-то вроде crosstab на двух фреймах данных:

df = pd.DataFrame({'a': list(range(3)), 'b': list(range(3))})
df2 = pd.DataFrame([[1,2],[3,4]], columns=('c','d'))

pd.concat((df2.loc[np.tile(df2.index, len(df))].reset_index(drop=True),
           df.loc[df.index.repeat(len(df2))].reset_index(drop=True)),
          axis=1, ignore_index=True)

Вывод:

    0   1   2   3
0   1   2   0   0
1   3   4   0   0
2   1   2   1   1
3   3   4   1   1
4   1   2   2   2
5   3   4   2   2

Или аналогично:

common_idx = pd.MultiIndex.from_product((df.index, df2.index))

out1 = df.reindex(common_idx.get_level_values(0)).set_index(common_idx)

out2 = df2.reindex(common_idx.get_level_values(1)).set_index(common_idx)

pd.concat((out2,out1),axis=1).reset_index(drop=True)

выходы:

   c  d  a  b
0  1  2  0  0
1  3  4  0  0
2  1  2  1  1
3  3  4  1  1
4  1  2  2  2
5  3  4  2  2
...