将具有字符串分隔值的列转换为行

时间:2014-06-25 22:19:45

标签: python pandas

我正在尝试实现以下内容:我知道如何使用2列,但我需要将其扩展到2列以上。换句话说,var2和var3需要被复制并向下扩展并映射到var1 col中的每个值。

                  var1   var2        var3
0          47429,47404  10700  1403298300
1    23030,23831,23147  99999  1403297100

试图获得:

   var1    var2  var3
0  47429  10700  1403298300
1  47404  10700  1403298300
2  23030  99999  1403297100
3  23831  99999  1403297100
4  23147  99999  1403297100

来自其他帖子的此代码仅使用两列而不是3:

pd.concat([pd.Series(row['var2'], row['var1'].split(','))\
    for _, row in testdf.iterrows()]).reset_index()[:5]

1 个答案:

答案 0 :(得分:2)

在一个大问题上:​​

In [107]: df
Out[107]: 
                var1   var2        var3
0        47429,47404  10700  1403298300
1  23030,23831,23147  99999  1403297100

In [108]: pd.concat((pd.Series((v, row['var2'], row['var3']), df.columns) for _, row in df.iterrows() for v in row['var1'].split(',')), axis=1).T
Out[108]: 
    var1   var2        var3
0  47429  10700  1403298300
1  47404  10700  1403298300
2  23030  99999  1403297100
3  23831  99999  1403297100
4  23147  99999  1403297100

内部嵌套生成器就是那些诀窍。 他们基本上和这些for循环做同样的工作:

In [112]: for _, row in df.iterrows():
    for v in row['var1'].split(","):
        print (v, row['var2'], row['var3'])
   .....:         
('47429', 10700, 1403298300)
('47404', 10700, 1403298300)
('23030', 99999, 1403297100)
('23831', 99999, 1403297100)
('23147', 99999, 1403297100)

我还将原始数据框的列标题添加到生成的Series

最后,由于我没有熊猫专家,我解决了沿着轴1连接系列然后转置 数据框以使其处于正确的结构中。