如果名称在列表中,请选择 Pandas 数据帧的列,或者创建默认值并删除其余列



我有一个要从数据帧获取的列名列表。

  1. 如果在列表中,我们只想对指定的列进行切片
  2. 如果不在列表中,我们希望生成一个占位符默认列 0
  3. 如果数据帧中还有其他列名,则它们无关紧要,应删除或以其他方式忽略。

添加单个 pandas 列是显而易见的: Pandas:如果不存在,则添加列,但我正在寻找一种高效且清晰的方法来添加多个列(如果它们不存在(。

d = {'a': [1, 2], 'b': [3, 4], 'c': [5,6], 'd': [7,8]}
df = pd.DataFrame(d) 
df
a  b  c  d
0  1  3  5  7
1  2  4  6  8
requested_cols = ['a','b','x','y','z']

我尝试了类似的东西:

valid_cols = df.columns.values
missing_col_names = [col_name for col_name in requested_cols if col_name not in valid_cols]
df = df.reindex(list(df) + missing_col_names, axis=1).fillna(0)
df = df.loc[:,df.columns.isin(valid_cols)]
df = df.reindex(list(valid_cols))

但这只给我留下了功能名称的交集。

这是你需要的吗?

df.reindex(columns = requested_cols, fill_value=0)
Out[134]: 
a  b  x  y  z
0  1  3  0  0  0
1  2  4  0  0  0

您可以使用条件列表推导式来查找有效列和缺失列。 然后从数据帧中选择有效列,并使用字典推导式分配默认值为零的新列。

valid_cols = [c for c in requested_cols if c in df]
missing_cols = [c for c in requested_cols if c not in df]
>>> df[valid_cols].assign(**{missing_col: 0 for missing_col in missing_cols})
a  b  x  y  z
0  1  3  0  0  0
1  2  4  0  0  0

相关内容

最新更新