在pandas中每行连接列

时间:2018-04-09 11:50:47

标签: python r pandas

简而言之:

df = data.frame(a = letters[1:5], b = letters[6:10], c = letters[11:15],stringsAsFactors = F)
df$tot = apply(df,MARGIN = 1,function(x){paste(x,collapse = "")})
我在Python Pandas中尝试过:

df.apply(lambda row: ''.join(str(row)), axis=1)

它会导致一个疯狂的结果,也会在列字符串中添加列标题。

我必须从R迁移到Python,我发现它非常违反直觉,可以做一些简单的事情,比如这个操作。任何人都可以解释为什么包含colnames的逻辑吗?

2 个答案:

答案 0 :(得分:3)

当你这样做时

df.apply(lambda row: ''.join(str(row)), axis=1)

row是一个pandas系列,str(row)是这个系列的字符串表示(当你打印(行)时可以看到)。

如果我正确地理解了你想要做什么,你想获得系列中的值列表并将它们连接起来。这可以写成:

df.apply(lambda row: "".join(row.values), axis=1)

答案 1 :(得分:3)

str(row)将行转换为字符串,例如:

str([1, 2, 3]) => '[1, 2, 3]'
str(['a','b']) => '["a", "b"]'

和''。join(x)其中x是一个字符串,返回相同的字符串。所以你的lambda会在字符串中转换一行。

但似乎你想要的是:在加入行之前将行的每个元素转换为字符串:

lambda row: ''.join(str(x) for x in row)