首页 > 解决方案 > 如何最好地解压元组的 Pandas 数据框?

问题描述

可能真的很简单,但我对谷歌没有运气。我有一个 2 列元组数据框,我希望解包每个元组,然后将每列中相同位置的内容配对。例如:

Col1     Col2
(a,b,c)  (d,e,f)

我想要的输出是

a d
b e
c f

我有一个使用循环的解决方案,但我想知道一种更好的方法 - 首先是因为我试图从我的生活中消除循环,其次是因为它可能不像我需要的那样灵活。

l1=[('a','b'),('c','d'),('e','f','g'),('h','i')]
l2=[('j','k'),('l','m'),('n','o','p'),('q','r')]

df  = pd.DataFrame(list(zip(l1,l2)),columns=['Col1','Col2'])

df
Out[547]: 
        Col1       Col2
0     (a, b)     (j, k)
1     (c, d)     (l, m)
2  (e, f, g)  (n, o, p)
3     (h, i)     (q, r)

for i in range(len(df)):
    for j in range(len(df.iloc[i][1])):
            print(df.iloc[i][0][j], df.iloc[i][1][j])
    
a j
b k
c l
d m
e n
f o
g p
h q
i r

非常感谢所有 pythonic 建议和指导。非常感谢。

另外:根据下面 Ch3steR 的请求,一个包含具有不同长度元组的行的示例 - 我的循环在这种情况下不起作用(不包括“d2”,我希望它与空值配对输出)。

l1=[('a','b'),('c','d','d2'),('e','f','g'),('h','i')]
l2=[('j','k'),('l','m'),('n','o','p'),('q','r')]

df  = pd.DataFrame(list(zip(l1,l2)),columns=['Col1','Col2'])

标签: pythonpandasloopstuples

解决方案


发送每个系列tolist,然后重建 DataFrame 和stack. 然后concat一起回来。这将为您留下MultiIndex第一级是原始 DataFrame 索引,第二级是元组中的位置。

这将适用于旧版本的 pandaspd.__version__ < '1.3.0'以及元组具有不相等数量的元素的情况(其中explode将失败)

import pandas as pd

df1 = pd.concat([pd.DataFrame(df[col].tolist()).stack().rename(col) 
                 for col in df.columns], axis=1)

    Col1 Col2
0 0    a    j
  1    b    k
1 0    c    l
  1    d    m
2 0    e    n
  1    f    o
  2    g    p
3 0    h    q
  1    i    r

推荐阅读