如何将pandas数据帧列连接成可迭代的列表?

4

我正在处理一个大约有200列的Pandas数据框。第31到73列的内容看起来像这样:

31   32   33
NaN  NaN  Z
X    NaN  Z
NaN  NaN  NaN
NaN  Y    Z

我希望返回一个新的列,看起来应该像这样:
new_col
[Z]
[X,Z]
[]
[Y,Z]

我很接近成功,但还没有完全达到目标。这段代码:

data['new_col'] = data.ix[:, 30:73].fillna('').apply(lambda row: ','.join(map(str, row)), axis=1)

返回这个:
new_col
,,Z
,X,,Z
,,,
,,Y,Z

如何从新的连接列表中排除不必要的分隔符?

1
等一下,你是想让列的每个元素成为一个列表还是一个字符串? - DSM
你是想要我的答案输出还是一个逗号分隔的值字符串? - EdChum
1个回答

3

看起来你有一个错误的值Nan,我假设是NaN,无论如何这个应该可以工作:

In [24]:
df.apply(lambda x: [','.join(x.dropna())], axis=1)

Out[24]:
0      [Z]
1    [X,Z]
2       []
3    [Y,Z]
dtype: object

因此在您的情况下:

data['new_col'] = data.apply(lambda x: [','.join(x.dropna())], axis=1)

应该可以正常工作。


2
@samthebrand:只是为了明确起见,一开始就建议不要使用包含列表的列,但包含列表的列,其中每个列表都有一个元素是字符串,这并不是一种很好的 Pandorable 方法。 - DSM
@DSM 我想我明白你的意思了(刚遇到一个“不可哈希类型:'list'”警告)。我不太确定我在做什么(像往常一样),但希望最终能够迭代数据框,具体取决于 new_col 是否包含 ZX 或该列中可能存在的值的组合。将这些“列表”存储为不同的数据类型是否有意义? - samthebrand
1
你可以把它们放在一个集合中,这样就可以测试成员资格了。 - EdChum
嗯,@EdChum,我有点难以理解如何修改你的片段,使其返回集合。你能给个提示吗? - samthebrand
1
df.apply(lambda x: {','.join(x.dropna())}, axis=1) 转化为 data['new_col'] = data.apply(lambda x: {','.join(x.dropna())}, axis=1) - EdChum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接