Суммирование нескольких списков, хранящихся в фрейме данных - PullRequest
0 голосов
/ 30 августа 2018

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

У меня есть два кадра данных:

df1.ix[1:3]
DateTime      Col1     Col2 
2018-01-02    [1, 2]   [11, 21]
2018-01-03    [3, 4]   [31, 41]

Я хочу суммировать списки в df1, чтобы получить:

DateTime      sumCol 
2018-01-02    [12, 23]
2018-01-03    [34, 45]

Я пытался numpy.sum(df1, axis=1), но это вызывает объединение списка вместо суммы.

Edit: Мой оригинальный фрейм данных имеет более 2 столбцов.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Не делай этого. Это чрезвычайно неэффективный способ использования фреймов данных Pandas, поскольку ваша серия списков имеет тип dtype object и не может быть напрямую доступна NumPy.

Но, если вы настаиваете, хотя бы частично векторизуйте свои вычисления. Например, используя NumPy:

arr1 = np.array(df['Col1'].values.tolist())
arr2 = np.array(df['Col2'].values.tolist())

df['Sum'] = pd.DataFrame(arr1 + arr2).values.tolist()

print(df)

     DateTime    Col1      Col2       Sum
0  2018-01-02  [1, 2]  [11, 21]  [12, 23]
1  2018-01-03  [3, 4]  [31, 41]  [34, 45]

Примечание, ix устарело с Pandas v0.20.0. Вместо этого используйте loc.

0 голосов
/ 30 августа 2018

Использование списка и np.array:

df.assign(sumCol=[np.array(x) + np.array(y) for x, y in zip(df.Col1, df.Col2)])

     DateTime    Col1      Col2    sumCol
0  2018-01-02  [1, 2]  [11, 21]  [12, 23]
1  2018-01-03  [3, 4]  [31, 41]  [34, 45]

Если массивы всегда одинаковой длины:

df.assign(sumCol=[np.stack([x,y]).sum(0) for x, y in zip(df.Col1, df.Col2)])

Чтобы применить это ко многим столбцам, вы можете использовать iloc

zip(*df.iloc[:, 1:].values.T)

Вот пример более широкого DataFrame:

   A       B       C       D
0  1  [1, 2]  [1, 2]  [1, 2]
1  2  [3, 4]  [3, 4]  [3, 4]
2  3  [5, 6]  [5, 6]  [5, 6]

Использование zip с df.values

df.assign(sumCol=[np.stack(a).sum(0) for a in zip(*df.iloc[:, 1:].values.T)])

   A       B       C       D    sumCol
0  1  [1, 2]  [1, 2]  [1, 2]    [3, 6]
1  2  [3, 4]  [3, 4]  [3, 4]   [9, 12]
2  3  [5, 6]  [5, 6]  [5, 6]  [15, 18]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...