python - 使用单个值重新分配多个列

标签 python pandas dataframe

这是一个示例数据

import pandas as pd
cols = ['Country','Name','SomeNumber','SomeDate']
sourceData  = [('WI','Vivian',34,'#1985-01-01#'),
               ('IND','Sam',56,'#1988-02-01#'),
               ('NZ','Richard',324,'#1987-07-01#'),
               ('AUS','Don',98,'#1998-07-12#'),
               ('SL','Simth',101,'#2001-07-12#'),]
x = pd.DataFrame(sourceData,columns=cols)
x
  Country     Name  SomeNumber      SomeDate
0      WI   Vivian          34  #1985-01-01#
1     IND      Sam          56  #1988-02-01#
2      NZ  Richard         324  #1987-07-01#
3     AUS      Don          98  #1998-07-12#
4      SL    Simth         101  #2001-07-12#

我想做的是,更新每一列,表中缺少值的每个值,“名称”列除外

现在,更新数据框应该如下所示:

   Country     Name SomeNumber SomeDate
0  MISSING   Vivian    MISSING  MISSING
1  MISSING      Sam    MISSING  MISSING
2  MISSING  Richard    MISSING  MISSING
3  MISSING      Don    MISSING  MISSING
4  MISSING    Simth    MISSING  MISSING

请注意,考虑到在现实世界中我有 114 列,我不想做这样的事情:

x['Country'] = 'MISSING'
x['SomeNumber'] = 'MISSING'
x['SomeDate'] = 'MISSING'

我试过这个:

cols.remove('Name')
x[cols] = 'MISSING"

但它给了我以下警告,我想避免:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#inde
xing-view-versus-copy
  inTardisMissingInSource[cols] = 'MISSING'
C:\tardis\desktop\environment\python\lib\site-packages\pandas\core\indexing.py:477: SettingWithCopyW
arning:

最佳答案

SettingWithCopyWarning 很好地表明您在错误的地方使用了 bool 索引。您应该改为使用 df.loc,如下所示:

In [1430]: x.loc[:, x.columns.difference(['Name'])] = 'MISSING'

In [1431]: x
Out[1431]: 
   Country     Name SomeNumber SomeDate
0  MISSING   Vivian    MISSING  MISSING
1  MISSING      Sam    MISSING  MISSING
2  MISSING  Richard    MISSING  MISSING
3  MISSING      Don    MISSING  MISSING
4  MISSING    Simth    MISSING  MISSING

主要部分是 x.columns.difference([...])。传入要排除的列标题列表,这些列将不会被选取用于分配。

请注意,这种混合赋值会改变行的dtype,请谨慎使用。


如果你不想就地赋值,你可以通过解压一个字典来使用df.assign:

In [1435]: x.assign(**{ k : 'MISSING' for k in x.columns.difference(['Name'])})
Out[1435]: 
   Country     Name SomeNumber SomeDate
0  MISSING   Vivian    MISSING  MISSING
1  MISSING      Sam    MISSING  MISSING
2  MISSING  Richard    MISSING  MISSING
3  MISSING      Don    MISSING  MISSING
4  MISSING    Simth    MISSING  MISSING

关于python - 使用单个值重新分配多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45883600/

相关文章:

python - 如何在 Pandas 中进行复杂的选择?

在我的类装饰器中对 __getitem__ 的 Python 递归

python - Pandas 事件研究

python - 如何在Python中从两列创建一个具有小时间隔的列?

python - 使用 pandas 数据框中使用多列的多个自定义函数聚合多列的有效方法是什么?

python - 如何计算具有非空值的列与行之间的交集

python - 我将如何在 python 中提取水平和垂直格式化的数据?

python - 脚本在 CMD 中运行时因 AttributeError 而失败,但在 IDLE 中执行正常

python - Django:想要将一个空字段显示为空白而不是显示无

python - 是否有一个函数可以返回定义用户定义类的文件?