我正在将多个JSON对象读入一个DataFrame。问题是有些列是列表。而且,数据非常大,因此我不能使用互联网上可用的解决方案。它们非常慢,内存效率很低
以下是我的数据的外观:
df = pd.DataFrame({'A': ['x1','x2','x3', 'x4'], 'B':[['v1','v2'],['v3','v4'],['v5','v6'],['v7','v8']], 'C':[['c1','c2'],['c3','c4'],['c5','c6'],['c7','c8']],'D':[['d1','d2'],['d3','d4'],['d5','d6'],['d7','d8']], 'E':[['e1','e2'],['e3','e4'],['e5','e6'],['e7','e8']]})
A B C D E
0 x1 [v1, v2] [c1, c2] [d1, d2] [e1, e2]
1 x2 [v3, v4] [c3, c4] [d3, d4] [e3, e4]
2 x3 [v5, v6] [c5, c6] [d5, d6] [e5, e6]
3 x4 [v7, v8] [c7, c8] [d7, d8] [e7, e8]
这是我的数据的形状:(441079,第12页)
我想要的输出是:
A B C D E
0 x1 v1 c1 d1 e1
0 x1 v2 c2 d2 e2
1 x2 v3 c3 d3 e3
1 x2 v4 c4 d4 e4
.....
编辑:在被标记为重复之后,我想强调一个事实,在这个问题中,我正在寻找一种 * 有效 * 的方法来分解多个列。因此,被认可的答案能够在非常大的数据集上有效地分解任意数量的列。这是另一个问题的答案没有做到的(这就是我在测试这些解决方案后问这个问题的原因)。
7条答案
按热度按时间dced5bon1#
Pandas数量〉= 0.25
假设所有列都有相同数量的列表,则可以对每列调用
Series.explode
。其思想是将必须NOT首先分解的所有列设置为索引,然后重置索引。
这也是快。
ds97pgxw2#
在
A
上使用set_index
,在其余列apply
和stack
上使用值。所有这些都压缩到一行中。6l7fqoea3#
用法:
kiayqfof4#
基于@cs95的答案,我们可以在
lambda
函数中使用if
子句,而不是将所有其他列设置为index
。这样做有以下优点:x.name in [...]
或不修改x.name not in [...]
,可以轻松指定列。lvjbypge5#
截至
pandas 1.3.0
:DataFrame.explode()
现在支持分解多个列。它的column参数现在还接受一个str或tuple列表,以便同时分解多个列(GH39240)1.3.0中的新功能(2021年7月2日)
所以现在这个操作就像这样简单:
第一个
或者,如果需要唯一索引:
第一次
vsikbqxv6#
下面是我使用'apply'函数的解决方案。主要功能/区别:
1.提供指定选定多列或所有列的选项
1.提供指定值以填充“缺少”位置的选项(通过参数fill_mode =“外部”;“内部”;或“trim”,解释可能会很长,请参见下面的示例,并尝试自己更改选项并检查结果)
注:选项“修剪”是为我的需要而开发的,超出了此问题的范围
示例:
输出量:
jckbn6z77#
收集这个线程和其他线程上的所有响应,下面是我对逗号分隔的行的处理方法: