我有一个pandas dataframe
,其中一列文本字符串包含逗号分隔的值。我想分割每个CSV字段,并为每个条目创建一个新行(假设CSV是干净的,只需要在“,”上分割)。例如,a
应该变成b
:
In [7]: a
Out[7]:
var1 var2
0 a,b,c 1
1 d,e,f 2
In [8]: b
Out[8]:
var1 var2
0 a 1
1 b 1
2 c 1
3 d 2
4 e 2
5 f 2
到目前为止,我已经尝试了各种简单的函数,但是.apply
方法在轴上使用时似乎只接受一行作为返回值,我无法让.transform
工作。任何建议都将不胜感激
示例数据:
from pandas import DataFrame
import numpy as np
a = DataFrame([{'var1': 'a,b,c', 'var2': 1},
{'var1': 'd,e,f', 'var2': 2}])
b = DataFrame([{'var1': 'a', 'var2': 1},
{'var1': 'b', 'var2': 1},
{'var1': 'c', 'var2': 1},
{'var1': 'd', 'var2': 2},
{'var1': 'e', 'var2': 2},
{'var1': 'f', 'var2': 2}])
我知道这不起作用,因为我们通过numpy丢失了数据帧元数据,但它应该让您了解我试图做的事情:
def fun(row):
letters = row['var1']
letters = letters.split(',')
out = np.array([row] * len(letters))
out['var1'] = letters
a['idx'] = range(a.shape[0])
z = a.groupby('idx')
z.transform(fun)
熊猫>;=0.25
Series和DataFrame方法定义了一个^{} 方法,该方法将列表分解为单独的行。请参阅Exploding a list-like column的文档部分
因为您有一个逗号分隔的字符串列表,所以在逗号上拆分字符串以获得元素列表,然后在该列上调用
explode
请注意
explode
只对单个列起作用(目前)。要同时分解多个列,请参见下文南斯和空名单得到了他们应得的待遇,而你不必费尽心机去做正确的事情
与基于
ravel
/repeat
的解决方案相比,这是一个巨大的优势(它完全忽略空列表,并且阻塞了NAN)分解多个列
请注意
explode
一次只能对单个列起作用,但您可以使用apply
一次分解多个列:其思想是将所有应该而不是的列设置为索引,然后通过
apply
分解其余的列。当列表大小相同时,这种方法效果很好更新3:使用^{} / ^{} methods (在Pandas 0.25.0中实现,并在Pandas 1.3.0中扩展以支持多列分解)更有意义,如使用示例所示:
对于单个列:
对于多列(对于熊猫1.3.0+):
更新2:更通用的向量化函数,可用于多个
normal
列和多个list
列演示:
多个
list
列-所有list
列在每行中必须具有相同的#元素:保留原始索引值:
设置:
CSV列:
使用这个小技巧,我们可以将类似CSV的列转换为
list
列:更新:通用矢量化方法(也适用于多列):
原始DF:
解决方案:
首先,让我们将CSV字符串转换为列表:
现在我们可以这样做:
旧答案:
受@AFinkelstein solution的启发,我想让它更通用一点,可以应用于具有两列以上的DF,并且速度几乎与AFinkelstein的解决方案一样快):
在痛苦的实验之后,我找到了一个比公认答案更快的答案,我成功了。它在我试用过的数据集上运行速度快了100倍左右
如果有人知道如何使这更优雅,请务必修改我的代码。我找不到一种不设置其他列作为索引,然后重置索引并重新命名列的方法,但是我可以想象还有其他方法可以工作
相关问题 更多 >
编程相关推荐