熊猫:添加包含列表的多索引系列/数据帧

时间:2015-03-12 16:41:04

标签: python pandas add dataframe series

如何添加/合并两个包含列表作为元素的multiindex Series / DataFrame(在我的情况下是一个端口序列或时间戳序列)。特别是,如何处理只出现在一个Series / DataFrame中的索引?不幸的是,.add() - 方法只允许fill_value参数的浮点数,而不是空列表。

我的数据:

print series1
print series2

IP               sessionID
195.12*.21*.11*  49                    [5900]
                 50         [5900, 5900, 5900, 5900, ...

IP               sessionID
85.15*.24*.12*   63                    [3389]
91.20*.4*.14*    68           [445, 445, 139]
113.9*.4*.16*    75                 [23, 210]
195.12*.21*.11*  49                    [5905]

预期结果:

IP               sessionID
195.12*.21*.11*  49              [5900, 5905]
                 50         [5900, 5900, 5900, 5900, ...
85.15*.24*.12*   63                    [3389]
91.20*.4*.14*    68           [445, 445, 139]
113.9*.4*.16*    75                 [23, 210]

奇怪的是,series1.add(series1)series2.add(series2)确实可以正常工作并按预期方式附加列表,但是series1.add(series2)会产生运行时错误。 series1.combine_first(series2)有效,但它不会合并列表 - 它只需要一个。有什么想法吗?

是的,我知道列表作为元素是坏的风格,但这就是我的数据现在的方式。对不起。为了简短起见我刚刚发布了系列示例,如果您还需要DataFrame示例,请告诉我。

1 个答案:

答案 0 :(得分:1)

如果有任何其他可怜的幽灵需要此信息...... 这似乎是一个肮脏的解决方案,但它的工作原理:

# add() works for mutual indices, so find intersection and call it
# fortunately, it appends list2 to list1!
intersection = series1.index.intersection(series2.index)
inter1 = series1[series1.index.isin(intersection)]
inter2 = series2[series2.index.isin(intersection)]
interAppend = inter1.add(inter2)

# combine_first() unions indices and keeps the values of the caller,
# so it will keep the appended lists on mutual indices,
# while it adds new indices and corresponding values
exclusiveAdd = interAppend.combine_first(series1).combine_first(series2)