2015-06-26 3 views
2

Есть ли операция в пандах, которая делает то же самое, что и flatMap в pyspark?pyspark's flatMap in pandas

flatMap пример:

>>> rdd = sc.parallelize([2, 3, 4]) 
>>> sorted(rdd.flatMap(lambda x: range(1, x)).collect()) 
[1, 1, 1, 2, 2, 3] 

До сих пор я могу думать о apply с последующим itertools.chain, но мне интересно, если есть один шаг решение.

+3

Если это чисто панды вопрос, то это помогло бы более полно объяснить, что вы пытаетесь сделать (для людей, не знакомых с flatMap, что может быть много людей, здесь!) , Пример данных, желаемых результатов и т. Д. – JohnE

ответ

1

Я подозреваю, что ответ «нет, неэффективно».

Pandas не создан для вложенных данных, подобных этому. Я подозреваю, что дело вы рассматриваете в панде выглядит как следующее:

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame({'x': [[1, 2], [3, 4, 5]]}) 

In [3]: df 
Out[3]: 
      x 
0  [1, 2] 
1 [3, 4, 5] 

И что вы хотите что-то вроде следующего

x 
0 1 
0 2 
1 3 
1 4 
1 5 

Это гораздо более типично для normalize ваших данных в Python, прежде чем отправить его в Pandas. Если бы Pandas сделал это, то, вероятно, он мог бы работать только на медленных скоростях Python, а не на скоростях С.

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

+0

Можете ли вы ссылаться на ссылку на чтение, поддерживающую «Панда не построена для вложенных данных, подобных этому». заявление? Я и другие начинающие панды хотели бы узнать больше! :) – Tarrasch

+0

Вы читали документацию Pandas: http://pandas.pydata.org/? Это довольно полно. – MRocklin

2

Существует взлома. Я часто делаю что-то вроде

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame({'x': [[1, 2], [3, 4, 5]]}) 

In [3]: df['x'].apply(pd.Series).unstack().reset_index(drop=True) 
Out[3]: 
0  1 
1  3 
2  2 
3  4 
4 NaN 
5  5 
dtype: float64 

Введение NaN потому, что промежуточный объект создает MultiIndex, но для многих вещей, которые вы можете просто упасть, что:

In [4]: df['x'].apply(pd.Series).unstack().reset_index(drop=True).dropna() 
Out[4]: 
0 1 
1 3 
2 2 
3 4 
5 5 
dtype: float64 

Этот трюк использует все панд код , поэтому я ожидаю, что он будет достаточно эффективным, хотя может не понравиться такие вещи, как списки самых разных размеров.

-1

есть три шага, чтобы решить этот вопрос.

import pandas as pd 
df = pd.DataFrame({'x': [[1, 2], [3, 4, 5]]}) 
df_new = df['x'].apply(pd.Series).unstack().reset_index().dropna() 
df_new[['level_1',0]]` 

result picture