使用agg整理大熊猫中的一系列列表

时间:2020-02-24 15:40:25

标签: pandas

我有多个多索引列,每个列都有我要展平的元组列表(该列表,而不是元组),但我为此感到吃力。这就是我所拥有的:

df = pd.DataFrame([[[(1,'a')],[(6,'b')],np.nan,np.nan],[[(5,'d'),(10,'e')],np.nan,np.nan,[(8,'c')]]])
df.columns = pd.MultiIndex.from_tuples([('a', 0), ('a', 1), ('b', 0), ('b', 1)])

>>> df
                   a             b
                   0         1   0         1
0           [(1, a)]  [(6, b)] NaN       NaN
1  [(5, d), (10, e)]       NaN NaN  [(8, c)]

所需结果:

>>> df
                   a             b
0           [(1, a), (6, b)]  [NaN, NaN]
1      [(5, d), (10, e), NaN] [NaN, (8, c)]

我该怎么做?在此related question中,我尝试了以下操作:

>>> df.stack(level=1).groupby(level=[0]).agg(lambda x: np.array(list(x)).flatten())
   a  b
0  a  b
1  a  b

>>> df.stack(level=1).groupby(level=[0]).agg(lambda x: np.concatenate(list(x)))
...
Exception: Must produce aggregated value

2 个答案:

答案 0 :(得分:2)

这是一种方法:

# taken from https://stackoverflow.com/questions/12472338/flattening-a-list-recursively
def flatten(S):
    if S == []:
        return S
    if isinstance(S[0], list):
        return flatten(S[0]) + flatten(S[1:])
    return S[:1] + flatten(S[1:])

# reshape the data for get the desired structure
df2 = (df
     .unstack()
     .reset_index()
     .drop('level_1', 1)
     .groupby(['level_0', 'level_2'])[0]
     .apply(list).apply(flatten).unstack().T)

df2.index.name = None
df2.columns.name = None

print(df2)

                       a             b
0       [(1, a), (6, b)]      [na, na]
1  [(5, d), (10, e), na]  [na, (8, c)]

答案 1 :(得分:0)

找到了一个单班轮:

使用@YOLO提供的flatten自定义函数

>>> df.stack(level=1).groupby(level=0).agg(list).applymap(flatten)
                        a              b
0        [(1, a), (6, b)]     [nan, nan]
1  [(5, d), (10, e), nan]  [nan, (8, c)]

其中

def flatten(S):
    if S == []:
        return S
    if isinstance(S[0], list):
        return flatten(S[0]) + flatten(S[1:])
    return S[:1] + flatten(S[1:])