如何最好地解压 Pandas 元组数据框?
How Best to Unpack a Pandas Dataframe of Tuples?
可能真的很简单,但我对 Google 并不满意。我有一个 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'])
发送每个 Series tolist
,然后重建 DataFrame 和 stack
。然后 concat
一起回来。这将为您留下 MultiIndex
,第一级是原始 DataFrame 索引,第二级是元组中的位置。
这将适用于旧版本的 pandas pd.__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
如果元组长度始终匹配并且您没有更新版本的 pandas 将列表列传递给 explode
,请执行以下操作:
import pandas as pd
pd.concat([df.Col1.explode(), df.Col2.explode()], axis=1).reset_index(drop=True)
Col1 Col2
0 a j
1 b k
2 c l
3 d m
4 e n
5 f o
6 g p
7 h q
8 i r
可能真的很简单,但我对 Google 并不满意。我有一个 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'])
发送每个 Series tolist
,然后重建 DataFrame 和 stack
。然后 concat
一起回来。这将为您留下 MultiIndex
,第一级是原始 DataFrame 索引,第二级是元组中的位置。
这将适用于旧版本的 pandas pd.__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
如果元组长度始终匹配并且您没有更新版本的 pandas 将列表列传递给 explode
,请执行以下操作:
import pandas as pd
pd.concat([df.Col1.explode(), df.Col2.explode()], axis=1).reset_index(drop=True)
Col1 Col2
0 a j
1 b k
2 c l
3 d m
4 e n
5 f o
6 g p
7 h q
8 i r