Слияние фреймов данных с массивами в столбцах - PullRequest
0 голосов
/ 04 октября 2018

В pandas как объединить два набора данных так, чтобы массивы, содержащиеся в столбцах, объединялись?

Например, пусть d1 и d2 объединяют два набора данных.В моем случае у меня есть около 100 сравнительно небольших фреймов данных для объединения:

>> d1  
        id       seq
0   AAA         (1, 2, 3, 4)
1   BBB         (1, 2, 3, 4) <---

>> d2
        id       seq
0   CCC         (1, 2, 3, 4)
1   DDD         (1, 2, 3, 4)
2   BBB         (5, 6, 7) <---

Теперь мы хотим:

>> df
      id          seq
    AAA         (1, 2, 3, 4)
    BBB         (1, 2, 3, 4, 5, 6, 7) <---
    DDD         (1, 2, 3, 4)
    CCC         (1, 2, 3, 4)

Как это сделать эффективно?

Я попытался объединитьно, похоже, я обязан пройти методом apply, которого я хочу избежать.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

IIUC

pd.concat([df1,df2]).groupby('id',as_index=False).seq.sum()
Out[860]: 
  id                 seq
0  A        (1, 2, 3, 4)
1  B  (1, 2, 3, 4, 5, 6, 7)
2  C        (1, 2, 3, 4)
3  D        (1, 2, 3, 4)
0 голосов
/ 04 октября 2018

Не используйте кортежи / списки / dicts в DataFrame, потому что потеря функций в функциях pandas потерянная.

Решение, если кортежи в столбце seq:

dfs = [df1, df2]
df = pd.concat(dfs).groupby('ip')['seq']
       .apply(lambda x: tuple([z for y in x for z in y]))
       .reset_index()
print (df)
            ip                    seq
0   110.11.1.5  (1, 2, 3, 4, 5, 6, 7)
1  115.65.20.1           (1, 2, 3, 4)
2   118.11.1.5           (1, 2, 3, 4)
3   55.65.85.1           (1, 2, 3, 4)

Производительность с выравниванием немноголучше:

dfs = [df1, df2] * 50

In [57]: %timeit pd.concat(dfs).groupby('ip',as_index=False).seq.sum()
15.7 ms ± 452 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [58]: %timeit pd.concat(dfs).groupby('ip')['seq'].apply(lambda x: tuple([z for y in x for z in y])).reset_index()
7.86 ms ± 72.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...