将包含字符串和 NAN 的列转换为 Pandas 中的整数列表
Posted
技术标签:
【中文标题】将包含字符串和 NAN 的列转换为 Pandas 中的整数列表【英文标题】:Convert column containing string and NAN to list of integers in Pandas 【发布时间】:2016-10-30 06:47:20 【问题描述】:我有一个从 CSV 文件中读取的数据框,其中包含一些包含列表的列。然而,它们最终在 Pandas 中以字符串形式出现,如本例中的 B 列。我想将此列转换为包含整数列表的新列。一些并发症。 1) 原始列中有一些 NaN 值。这阻止了 ast.literal_eval 为我工作。 2)如果可能,我希望所有结果列表的长度都相同(该列中最长列表的长度),并用 NAN 填充。所以最后它应该看起来像 C 列,其中每个元素都是一个整数列表。这和我所得到的一样接近。所以我有一个字符串列表,但不是整数,也没有填充到最大长度。好吧,至少我是这么认为的! :-)
import pandas as pd
import numpy as np
from IPython.display import display
df = pd.DataFrame('A' : (1,2,3), 'B': ('[0,1]',np.nan,'[0,1,2]'), \
'C': ([0,1,np.nan],[np.nan,np.nan,np.nan],[0,1,2]))
df['D'] = df['B'].str.replace(']','').str.replace('[','').str.split('\W')
display("Starting point: ", df['B'][0])
display("What I want: ", df['C'][0])
display("What I have so far: ", df['D'][0])
这是上面的输出:
Starting point:
[0,1]
What I want:
[0, 1, nan]
What I have so far:
['0', '1']
任何帮助都将不胜感激,并且会为我节省很多头发。
【问题讨论】:
我认为您必须迭代 D 列中的所有列表以获得最大长度。然后你可以像这样扩展所有较短的列表:aList.extend(np.nan*(maxLen - len(aList)))
【参考方案1】:
这应该可以完成:
b = df.B.str.extract(r'\[(.*)\]', expand=False).str.split(',', expand=True).fillna(np.nan)
df['D'] = pd.DataFrame(b.apply(lambda x: tuple(x.values))).applymap(list)
【讨论】:
感谢 piRSquared!一个小的补充是将 ,axis=1 放在 (x.values) 之后,否则它会沿着列而不是行列出列表。所以它变成: df['D'] = pd.DataFrame(b.apply(lambda x: tuple(x.values),axis=1)).applymap(list)以上是关于将包含字符串和 NAN 的列转换为 Pandas 中的整数列表的主要内容,如果未能解决你的问题,请参考以下文章
将包含 NaN 的 Pandas 列转换为 dtype `int`
从 pandas 转换为 numpy 后,如果数组包含 nan,则删除“nan”或减少 numpy 数组的长度 [重复]